【问题标题】: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)

标签: c++ class


【解决方案1】:

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

【讨论】:

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

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

【讨论】:

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

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

两种可能的解决方案:

  1. 不要尝试替换 testing重置它。这就是@LogicStuff 在他对您的问题的评论中所说的。 _testing = testing(); 构造一个新的testing,然后将其状态复制到现有实例,使现有实例看起来像一个新实例。您可以(应该?)通过给testing 一个Reset 方法(其实现通常应该是分配*this = testing(); 而不是手动编码的每个成员变量的重置)来明确这一点。) - 只这样做 如果重置 testing 具有商业意义。
  2. 如果重置 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 更安全):stackoverflow.com/a/28823025/4056146。我正在使用 Boost 1.55 (Debian 8 repo),它没有 unique_ptr
猜你喜欢
  • 2011-04-16
  • 2021-07-28
  • 1970-01-01
  • 2014-05-27
  • 2017-02-08
  • 2016-07-19
  • 2015-02-21
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多