Я абсолютно не понимаю, почему люди говорят, что это невозможно.
Отсоединение инициализации от построения и обнуления (tm) от разрушения на самом деле очень просто.
class Clike
{
public:
Clike() : m_usable(true) {}
void clear(); // performs clean up then sets m_usable to false
~Clike() { if (m_usable) this->clear(); }
private:
bool m_usable;
// real variables
};
Тогда вы можете использовать его так:
Clike* c = new Clike();
c->clear(); // performs cleanup
// stuff
delete c;
На самом деле, поскольку деструкторы никогда не должны выбрасывать и ничего не возвращать, нет ничего необычного в том, что cleanup
и destruction
разделяются так, что операция cleanup
может выдавать ошибки Особенно для сложных зверей, таких как соединения с БД и т. Д. *
Хотя это и не «деструктор», он, безусловно, работает, и поэтому представленный C-код на самом деле прекрасно воспроизводится без такого необычного размещения и т. Д. *