Как правильно убрать класс в с ++ - PullRequest
0 голосов
/ 25 сентября 2019

Иногда необходимо снова перезапустить класс, но удаление его не гарантирует, что его статические переменные будут сброшены.Что нужно сделать чтобы класс ушел наверняка?

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

Src в github.com

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

В вашем коде x является статической переменной и не является членом класса.Таким образом, он никогда не будет сброшен.

В данном случае вы хотите не статическую переменную, а простой член класса:

class MyClass {
public:
    int x = 0;

    void runIs();
}

void MyClass::runIs()
{
    qDebug() << ++this->x;
}
0 голосов
/ 25 сентября 2019
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();
}
...