1

我正在研究一个ex1需要一个静态成员变量的类y。该静态成员变量是指向ex2具有自己的构造函数和析构函数的类对象的指针。现在我知道如何y通过在类外定义变量来初始化它。但是如何调用变量的析构函数y呢?我需要使用delete语句,但是该语句的放置位置。我需要调用 class 的构造函数和析构函数ex2

我的问题的等效代码如下所示:

#include<iostream>

class ex2 {
public:
  int n;
  ex2(int num) {
    n = num;
    std::cout << "Constructor of ex2\n";
  }
  ~ex2(){std::cout << "Destructor of ex2\n";}
};

class ex1 {
public:
  static ex2 *y;  //static member variable
  ex1() {std::cout << "Constructor of ex1\n";}
  ~ex1() {std::cout << "Destructor of ex1\n";}
};

ex2 *ex1::y = new ex2(90); //definition for static member

int main()
{
  ex1 y1;
  return 0;
}

输出是:

Constructor of ex2
Constructor of ex1
Destructor of ex1

请帮助了解如何调用ex2. 在类的所有实例都被销毁之后,还需要调用析构函数ex1

4

1 回答 1

1

您可以创建常规类,在销毁时调用delete您的指针:

struct Destroyer {
    ex2 *p;
    ~Destroyer() { delete p; }
};

ex2 *ex1::y = new ex2(90);
Destroyer dex2{ex1::y};

PS:根据我的经验,您应该避免在自动初始化和自动销毁期间放置过多的逻辑。有一些事情需要高度关注(在进行破坏时系统的哪些部分仍然可用?在构建过程中哪些部分已经可用?)此外,我发现即使像调试器这样的工具在那些时候也不能很好地工作。例如,作为一项规则,您永远不应该在 main 启动之前或 main 完成之后做任何可能因任何原因而失败的事情,因为这将是一个痛苦的管理(如果错误记录子系统不是,您如何在初始化期间记录错误) t 初始化了吗?如果日志系统已经关闭,如何在关闭期间记录错误?)。

我还认为 C++ 标准规范对这些问题有点模糊,因此您可能会根据编译器而感到惊讶,并且多年来我更喜欢从惰性/自动初始化和销毁​​转移到main按我想要的顺序完成的显式初始化和销毁我知道是正确的。

于 2020-04-03T06:49:00.617 回答