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

时间:2016-12-14 14:41:46

标签: c++ class

说我有两个类似的那样:

controller.hpp(由controller.cpp包含)

#include "testing.hpp"
class controller
{
    public:
        testing _testing;  // call constructor
}

testing.hpp

class testing
{
    public:
        testing();
        ~testing();
}

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

3 个答案:

答案 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被摧毁。

两种可能的解决方案:

  1. 而不是尝试替换 testing重置它。这就是@LogicStuff在他对你的问题的评论中所说的。 _testing = testing();构造一个新的testing,然后将其状态复制到现有实例,使现有实例看起来像一个新实例。您可以(应该?)通过赋予testing Reset方法(其实现通常应该是赋值*this = testing();而不是手动编码重置每个成员变量来明确这一点。) - 如果重置testing具有商业意义,请执行
  2. 如果重置 testing在业务级别上没有意义,而您实际上想要替换,那么请{{ 1}}拥有controller代替。然后,您可以随时std::unique_ptr<testing>reset新构建的实例,并且仍然可以确保自动调用析构函数。