草庐IT

C++ Qt 基类虚析构函数

我们是否需要一个用于Qt-way的类的虚拟析构函数:设置QObject-parent它将调用QObject的析构函数deleteLater()或对于它被设置为父对象的任何对象,是否有类似的东西?例如:classMyWidget:publicQWidget{public:MyWidget(){w=newQWidget(this);//"w"willbedeletedautomaticallybyparentMyWidget::QWidget::QObject'sdestructorafaik}private:QWidget*w;}如果MyWidget类要被继承,我们是否需要一个虚拟析构函

c++ - 使用 std::unique_ptr 的具有私有(private)析构函数的单例

我在我的程序中创建了所有单例,并牢记该文档:http://erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf(如果有人想知道为什么单例,它们都是工厂,其中一些存储一些关于它们应该如何创建实例的全局设置)。他们每个人看起来都像这样:声明:classSingletonAndFactory{staticSingletonAndFactory*volatileinstance;public:staticSingletonAndFactory&getInstance();private:SingletonAndFactory();Single

c++ - shared_ptr 析构函数、复制和不完整类型

我有一个头文件foo.h像这样(省略不相关的东西):#pragmaonce#includeclassBar;structFoo{std::shared_ptrgetBar();std::shared_ptrgetBar()const{returnconst_cast(this)->getBar();}};getBar()的非常量重载在.cpp文件中实现,该文件还可以看到Bar的完整定义.当foo.h包含在另一个文件中(没有看到Bar的定义),VS2010给我这样的警告:warningC4150:deletionofpointertoincompletetype'Bar';nodestr

c++ - 返回值优化和析构函数调用

我知道RVO应用最多,但我可以指望它吗?我有一个创建FlagContainer类对象的函数。classFlagContainer{public:~FlagContainer(){someItem->flag=true;}private:Item*someItem;}publicFlagContainercreateFlagContainer(){returnFlagContainer();}调用者使用容器后,必须设置标志。所以我可以用析构函数来做到这一点。{FlagContainercontainer=createFlagContainer();//dosomethingwithcon

c++ - 如何从成员析构函数中捕获异常

我想知道是否(以及如何)捕获成员析构函数中抛出的异常。示例:#includeclassA{public:~A(){throwstd::exception("Igiveup!");}};classB{A_a;public:~B(){//Howtocatchexceptionsfrommemberdestructors?}}; 最佳答案 是的,您可以使用function-try-block:捕获此类异常classB{A_a;public:~B()try{//destructorbody}catch(conststd::exception

c++ - 抽象基类c++的析构函数和无构造函数

我搜索过这个,但我并没有真正理解答案。我是C++的新手,我想要实现的是拥有一个抽象类作为我的对象类型的基类,这样我就可以将我的对象存储在抽象类型的指针数组中类而不是使用void*。此外,我的对象共享一些公共(public)成员函数,这些函数可以通过抽象类实现轻松减少我的代码库。但是,我对抽象类的构造函数和析构函数感到困惑。抽象类实际上并不需要构造函数,因为可以传入的参数对于两者都是通用的,需要对派生类中的所述参数做不同的事情才能正确设置protected属性(矩阵的大小).那么,没有构造函数可以吗?另外,由于我没有构造函数,析构函数应该是什么?我说的是实现虚拟析构函数的答案。但是,我不

c++ - 派生类中的析构函数标记为 noexcept(false)

有如下代码:classMember{public:~Member()noexcept(false){}};classA{public:virtual~A(){}};classB:publicA{public:Memberm;};错误是:main.cpp:13:7:error:looserthrowspecifierfor‘virtualB::~B()noexcept(false)’classB:publicA^main.cpp:10:11:error:overriding‘virtualA::~A()noexcept’virtual~A(){}^为什么B类中的析构函数被标记为noexc

c++ - 复制构造函数、析构函数和赋值运算符。我们什么时候不需要它们?

我知道在你的类中添加cctor、dtor或op=时的C++经验法则,你还需要添加另外两个以使你的类在所有情况下都能正常工作。是否存在不需要提供全部三个而只需提供其中一两个的情况?如果您将其中一个添加到您的类中,为什么C++不要求您将它们全部添加?编辑1:当您不仅不需要其中一些,而且不想拥有它们时,您提到了示例,因此您希望将它们设为私有(private)或protected。但是即使是空体,您仍然需要在代码中编写它们。当你通过添加一个空主体的虚拟析构函数来使类多态时,我没有全部拥有它们的唯一正当理由。但是一旦你在析构函数的主体中写了一些东西,你就应该考虑在cctor和op=的主体中也写一

c++ - 显式调用基类析构函数/构造函数是否合法?

就地析构和构造基类对象以重置基类已知的状态部分是否合法?classC:publicBaseClass{...};Cc;c.BaseClass::~BaseClass();new(static_cast(&c))BaseClass;如果我们可以访问类的源代码,显然还有其他方法可以实现此效果。但是,我想从语言的角度了解是否有特定原因导致这无效。 最佳答案 不,这是不合法的。不允许替换对象的基础子对象。C++113.8/7指定只有在以下情况下才能重用对象的存储theoriginalobjectwasamostderivedobject(1

c++ - C++如何自动调用析构函数?

在C++中,我们可以通过对象来管理资源,即在Ctor中获取资源,在Dtor(RAII)中释放资源。这依赖于C++的自动析构函数调用。但这是如何在幕后完成的?例如,C++如何知道为c1而不是c2调用Dtor。(我知道这之前肯定已经回答过,但我所有的搜索都以解释如何使用RAII的主题结束)。谢谢!classCat;Catc1;Cat*c2=newCat();编辑:我知道我需要为c2调用delete。我只是不明白当c1超出范围时如何调用Dtor。 最佳答案 看看compilerexplorer.我已经链接了您示例的可构建版本。以防万一链接