静态成员变量(指针)的构造函数和析构函数
Constructor and Destructor for static member variable (a pointer)
我正在研究 class ex1
,它需要一个静态成员变量 y
。该静态成员变量是指向 class ex2
对象的指针,它有自己的构造函数和析构函数。现在我知道如何通过在 class 之外定义它来初始化变量 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
的析构函数。 class ex1
的所有实例都被销毁后,还需要调用析构函数。
您可以创建常规 class,在销毁时在您的指针上调用 delete
:
struct Destroyer {
ex2 *p;
~Destroyer() { delete p; }
};
ex2 *ex1::y = new ex2(90);
Destroyer dex2{ex1::y};
PS:根据我的经验,你应该避免在自动初始化和自动销毁期间放置太多逻辑。有一些事情需要高度注意(在销毁时系统的哪些部分仍然可以使用?哪些部分在构建过程中已经可以使用?)而且我发现在那个时候连调试器这样的工具都不能很好地工作。例如,作为一个规则,在 main 启动之前或 main 完成之后,你永远不应该做任何可能因任何原因而失败的事情,因为这将是一个管理起来的痛苦(如果错误记录子系统不是',你怎么能在初始化期间记录错误'尚未初始化?如果日志系统已经关闭,如何在关闭期间记录错误?)。
我还认为 C++ 标准规范对这些问题有些模糊,因此根据编译器的不同,您可能会感到惊讶,多年来我更喜欢从 lazy/automatic 初始化和销毁转移到显式初始化和销毁完成在 main
中按我想要的并且我知道是正确的顺序排列。
我正在研究 class ex1
,它需要一个静态成员变量 y
。该静态成员变量是指向 class ex2
对象的指针,它有自己的构造函数和析构函数。现在我知道如何通过在 class 之外定义它来初始化变量 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
的析构函数。 class ex1
的所有实例都被销毁后,还需要调用析构函数。
您可以创建常规 class,在销毁时在您的指针上调用 delete
:
struct Destroyer {
ex2 *p;
~Destroyer() { delete p; }
};
ex2 *ex1::y = new ex2(90);
Destroyer dex2{ex1::y};
PS:根据我的经验,你应该避免在自动初始化和自动销毁期间放置太多逻辑。有一些事情需要高度注意(在销毁时系统的哪些部分仍然可以使用?哪些部分在构建过程中已经可以使用?)而且我发现在那个时候连调试器这样的工具都不能很好地工作。例如,作为一个规则,在 main 启动之前或 main 完成之后,你永远不应该做任何可能因任何原因而失败的事情,因为这将是一个管理起来的痛苦(如果错误记录子系统不是',你怎么能在初始化期间记录错误'尚未初始化?如果日志系统已经关闭,如何在关闭期间记录错误?)。
我还认为 C++ 标准规范对这些问题有些模糊,因此根据编译器的不同,您可能会感到惊讶,多年来我更喜欢从 lazy/automatic 初始化和销毁转移到显式初始化和销毁完成在 main
中按我想要的并且我知道是正确的顺序排列。