(27) Vietare o imporre oggetti sullo heap.
Per impedire che un oggetto sia creato sullo stack basta dichiarare il distruttore privatamente. In questo modo sarà ancora possibile creare un oggetto sullo stack, ma quando il compilatore procederà alla sua rimozione automatica, troverà che la chiamata al distruttore gli é preclusa.
#include <iostream>
using namespace std;
class HeapBased {
private:
~HeapBased();
public:
void print() {
cout << "Hello." << endl;
}
};
int main() {
HeapBased hb;
hb.print();
}
Quando si compila il codice qui sopra, si ottengono errori come questi:
HeapBased.cpp:12: error: `HeapBased::~HeapBased()' is private
HeapBased.cpp:21: error: within this context
Per permettere la creazione di oggetti sullo heap aggiungiamo un metodo pubblico destroy() che richiama il distruttore privato:
#include <iostream>
using namespace std;
class HeapBased {
private:
~HeapBased();
public:
void destroy() const {
delete this;
}
void print() {
cout << "Hello." << endl;
}
};
HeapBased::~HeapBased() {
cout << "Object deleted" << endl;
}
int main() {
HeapBased* hb = new HeapBased();
hb->print();
hb->destroy();
}
Per proibire la generazione di oggetti sullo heap, d'altro canto, possiamo dichiarare come privato l'operator new, che viene richiamato automaticamente dal "new operator" globale. Per simmetria si dichiara privato anche operator delete, anche se la cosa sarebbe sovrabbondante.
Nessun commento:
Posta un commento