如何调用类析构函数/构造函数

Posted

技术标签:

【中文标题】如何调用类析构函数/构造函数【英文标题】:How to call class destructor / constructor 【发布时间】:2016-12-14 14:41:45 【问题描述】:

假设我有两个这样的课程:

controller.hpp(包含在 controller.cpp 中)

#include "testing.hpp"
class controller

    public:
        testing _testing;  // call constructor

测试.hpp

class testing

    public:
        testing();
        ~testing();

如何调用testing 的析构函数并从controller.cpp 重新构造它?谢谢你。

【问题讨论】:

_testing = testing(); 你不需要。它会在创建 controller 类的实例时自动发生!如果您想调用默认构造函数以外的其他内容,请在 controller 类的构造函数中使用 member initialization list。 @LogicStuff 谢谢。这给了我一大堆关于我的原子变量上的 Boost 删除函数的错误。再打电话给testing _testing;怎么样? @xinthose 这是一个数据成员声明。寻找解决您的错误的方法。你可能需要一个移动构造函数。 @LogicStuff OK。在这种情况下,我将如何使用移动构造函数?我在testing 类中使用原子布尔值:boost::atomic <bool> atomic_var false;testing _testing1;_testing = std::move(testing1) 【参考方案1】:

我认为,您完全误解了默认构造函数的概念。主要思想是您几乎从不显式调用默认构造函数(没有放置新的)。析构函数同上。因此,在您的情况下,每当 controller 对象被创建时,testing 构造函数将被自动调用,而它的析构函数将在 controller 对象被销毁时被调用。

【讨论】:

谢谢。我不想在controller 上调用析构函数,因为它运行我的主代码。所以我需要在我认为的头文件之外初始化testing对象。【参考方案2】:

您通常不会显式调用析构函数。它在对象被销毁时自动调用。在堆栈上创建对象时,当对象超出范围时会自动调用析构函数。当在堆上创建一个对象时(通过new'ing它),在对象上调用delete时会自动调用析构函数。

【讨论】:

有一种情况是显式调用析构函数。 好点,谢尔盖。感谢您的评论。我进行了编辑以反映您的评论。通常不会调用析构函数。就像你提到的,可以调用析构函数。 xinthose 提出的问题不清楚为什么需要显式调用析构函数。这就是为什么我以我的方式回答。【参考方案3】:

在您的代码中,controller 拥有 a testing。对于阅读代码的任何人来说,这意味着它是相同的 testingcontroller 的生命周期内。这当然也是 C++ 的看法 - 它会在构造 controller 期间构造 the testing 并在 controller 被销毁时销毁 the testing .

两种可能的解决方案:

    不要尝试替换 testing重置它。这就是@LogicStuff 在他对您的问题的评论中所说的。 _testing = testing(); 构造一个新的testing,然后将其状态复制到现有实例,使现有实例看起来像一个新实例。您可以(应该?)通过给testing 一个Reset 方法(其实现通常应该是分配*this = testing(); 而不是手动编码的每个成员变量的重置)来明确这一点。) - 只这样做 如果重置 testing 具有商业意义。 如果重置 testing 在业务层面上没有意义,而您实际上想要替换它,那么让controller 拥有一个@ 987654339@ 代替。然后,您可以在需要时随时 resetswap 新建一个实例,并确保会自动调用析构函数。

【讨论】:

我同意。谢谢你。代码看起来如何? std::unique_ptr <testing> _testing (new testing);? Nvm; std::unique_ptr <testing> _testing 编译。变量和函数可以通过-> 访问,而不再是.。现在我需要弄清楚如何将它与boost::thread thr (boost::bind(&testing::func1, &_testing)); 一起使用 原来我需要使用 shared_ptr 进行该操作(比 unique_ptr 更安全):***.com/a/28823025/4056146。我正在使用 Boost 1.55 (Debian 8 repo),它没有 unique_ptr

以上是关于如何调用类析构函数/构造函数的主要内容,如果未能解决你的问题,请参考以下文章

3. 23 模拟面试

在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

浅谈多态基类析构函数声明为虚函数

浅谈多态基类析构函数声明为虚函数

访问冲突 - 为啥基类析构函数被调用两次? [关闭]

在 MFC 中调用 EndDialog() 时,类析构函数何时触发?