我正在研究一个需要一个静态成员变量ex1
的类y
。该静态成员变量是指向类ex2
的对象的指针,该类具有自己的构造函数和析构函数。现在,我知道如何通过在类外部定义变量y
来对其进行初始化。但是,如何为变量y
调用析构函数呢?我需要使用delete
语句,但是要在哪里放置该语句。我需要同时调用类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
的实例之后,也需要调用析构函数。
您可以创建常规类,该类在销毁时会在指针上调用delete
:
struct Destroyer {
ex2 *p;
~Destroyer() { delete p; }
};
ex2 *ex1::y = new ex2(90);
Destroyer dex2{ex1::y};
PS:以我的经验,您应该避免在自动初始化和自动销毁过程中放置过多的逻辑。有一些事情需要引起高度关注(进行销毁时,系统的哪些部分仍然可用?在构建过程中哪些部分已经可用?),此外,调试器之类的工具在那段时间不能很好地工作。例如,通常,在启动main或完成main之后,绝不应该执行由于任何原因而失败的任何操作,因为这将很麻烦(如果错误记录子系统不是,如何在初始化期间记录错误?尚未初始化吗?如果日志记录系统已经关闭,如何在关闭期间记录错误?)。
我还认为C ++标准规范对这些问题有些模糊,因此您可能会因编译器而感到惊讶,并且多年来,我更倾向于从懒惰/自动初始化和销毁转向在main
中完成的显式初始化和销毁。我想要的顺序,我知道是正确的。