在 с++ 中正确删除 class
As correctly to remove class in с++
有时需要重新启动一个class,但删除它并不能保证它的静态变量会被重置。那一定要做到class离开了吗?
auto my = new MyClass;
for (int i = 0; i < 3; i++) {
delete my;
my = new MyClass;
my->runIs();
}
...
void MyClass::runIs()
{
static int x = 0;
qDebug() << ++x;
}
输出:
1
2
3
在您的代码中 x
是一个静态变量,不是 class 的成员。所以它永远不会被重置。
在这种情况下,您想要的不是静态变量,而是 class:
的简单成员
class MyClass {
public:
int x = 0;
void runIs();
}
void MyClass::runIs()
{
qDebug() << ++this->x;
}
MyClass* my;
for (int i = 0; i < 3; i++) {
my = new MyClass;
my->runIs();
delete my;
}
...
MyClass::MyClass(QObject* parent) : QObject(parent)
{
close_class = false;
}
void MyClass::runIs()
{
static int x = 0;
if (close_class) {
x = 0;
}
else {
qDebug() << ++x;
}
}
MyClass::~MyClass()
{
closeClass();
}
void MyClass::closeClass()
{
close_class = true;
runIs();
}
有时需要重新启动一个class,但删除它并不能保证它的静态变量会被重置。那一定要做到class离开了吗?
auto my = new MyClass;
for (int i = 0; i < 3; i++) {
delete my;
my = new MyClass;
my->runIs();
}
...
void MyClass::runIs()
{
static int x = 0;
qDebug() << ++x;
}
输出:
1
2
3
在您的代码中 x
是一个静态变量,不是 class 的成员。所以它永远不会被重置。
在这种情况下,您想要的不是静态变量,而是 class:
的简单成员class MyClass {
public:
int x = 0;
void runIs();
}
void MyClass::runIs()
{
qDebug() << ++this->x;
}
MyClass* my;
for (int i = 0; i < 3; i++) {
my = new MyClass;
my->runIs();
delete my;
}
...
MyClass::MyClass(QObject* parent) : QObject(parent)
{
close_class = false;
}
void MyClass::runIs()
{
static int x = 0;
if (close_class) {
x = 0;
}
else {
qDebug() << ++x;
}
}
MyClass::~MyClass()
{
closeClass();
}
void MyClass::closeClass()
{
close_class = true;
runIs();
}