Конструктор и деструктор для переменной-члена stati c (указатель) - PullRequest
1 голос
/ 03 апреля 2020

Я работаю над классом ex1, которому требуется одна переменная-член * stati c y. Эта переменная-член stati c является указателем на объект класса 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.

1 Ответ

1 голос
/ 03 апреля 2020

Вы можете создать обычный класс, который при разрушении вызывает delete по вашему указателю:

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

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

PS: По моему опыту, вы должны избегать слишком большого количества логик c во время автоматической инициализации c и автомат c уничтожение. Есть вещи, на которые следует обратить особое внимание (какие части вашей системы еще можно использовать при уничтожении? Какие части уже можно использовать во время строительства?), И более того, я обнаружил, что даже такие инструменты, как отладчики, не работают в те времена. Как правило, например, вы никогда не должны делать что-либо, что может по какой-либо причине дать сбой, до того, как будет запущено main или после того, как main будет завершено, потому что это будет трудной задачей (как вы можете регистрировать ошибку во время инициализации, если подсистема регистрации ошибок не была ''). t еще инициализирован? как вы можете записать ошибку во время выключения, если система журналирования уже выключена?).

Я также думаю, что стандартная спецификация C ++ не совсем понятна в этих вопросах, поэтому вы можете получить сюрпризы в зависимости от компиляторы, и на протяжении многих лет я предпочитал переходить от инициализации и уничтожения lazy / automati c к явной инициализации и уничтожению, выполненным в main в той последовательности, которую я хочу и которую я знаю, чтобы быть правильной.

...