如何调用类析构函数/构造函数
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
。对于阅读代码的任何人来说,这意味着它是相同的 testing
在controller
的生命周期内。这当然也是 C++ 的看法 - 它会在构造 controller
期间构造 the testing
并在 controller
被销毁时销毁 the testing
.
两种可能的解决方案:
-
不要尝试替换
testing
,重置它。这就是@LogicStuff 在他对您的问题的评论中所说的。 _testing = testing();
构造一个新的testing
,然后将其状态复制到现有实例,使现有实例看起来像一个新实例。您可以(应该?)通过给testing
一个Reset
方法(其实现通常应该是分配*this = testing();
而不是手动编码的每个成员变量的重置)来明确这一点。) - 只这样做 如果重置 testing
具有商业意义。
如果重置 testing
在业务层面上没有意义,而您实际上想要替换它,那么让controller
拥有一个@ 987654339@ 代替。然后,您可以在需要时随时 reset
或 swap
新建一个实例,并确保会自动调用析构函数。
【讨论】:
我同意。谢谢你。代码看起来如何?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
。以上是关于如何调用类析构函数/构造函数的主要内容,如果未能解决你的问题,请参考以下文章