说我有两个类似的那样:
controller.hpp(由controller.cpp包含)
#include "testing.hpp"
class controller
{
public:
testing _testing; // call constructor
}
testing.hpp
class testing
{
public:
testing();
~testing();
}
如何调用testing
的析构函数并从controller.cpp重新构造它?谢谢。
答案 0 :(得分:2)
您通常不会明确调用析构函数。当对象被销毁时,它会自动调用。在堆栈上创建对象时,当对象超出范围时,将自动调用析构函数。当在堆上创建一个对象时(通过new'),当在对象上调用delete时,会自动调用析构函数。
答案 1 :(得分:2)
我认为,你完全误解了默认构造函数的想法。主要思想是你几乎从不明确地调用默认构造函数(缺少placement new)。对于析构函数同样如此。因此,在您的情况下,testing
构造函数将在创建controller
对象时自动调用,并且只要controller
对象被销毁,就会调用它的析构函数。
答案 2 :(得分:1)
在您的代码中,controller
拥有 a testing
。对于阅读代码的任何人来说,这意味着{em>在testing
的生命周期中是相同的 controller
。这当然也是C ++看到它的方式 - 它将在testing
的构造过程中构造 controller
并在<{em> testing
时销毁 controller
被摧毁。
两种可能的解决方案:
testing
,重置它。这就是@LogicStuff在他对你的问题的评论中所说的。 _testing = testing();
构造一个新的testing
,然后将其状态复制到现有实例,使现有实例看起来像一个新实例。您可以(应该?)通过赋予testing
Reset
方法(其实现通常应该是赋值*this = testing();
而不是手动编码重置每个成员变量来明确这一点。) - 如果重置testing
具有商业意义,请执行 。testing
在业务级别上没有意义,而您实际上想要替换,那么请{{ 1}}拥有controller
代替。然后,您可以随时std::unique_ptr<testing>
或reset
新构建的实例,并且仍然可以确保自动调用析构函数。