2009-06-12 19 views
11

Come sovraccarico un distruttore?Come sovraccaricare un distruttore?

+2

Dal momento che non puoi, hai avuto un'idea di come usare un distruttore sovraccarico, o sei solo curioso? Se vuoi fare qualcosa di diverso da creare solo due distruttori per una classe, portalo su e possiamo discutere su come realizzarlo. –

+0

Mi chiedo se fosse possibile, come ti aspetteresti che si comporti? –

+0

Era una domanda sollevata da qualcun altro. Volevano vedere quanto velocemente SO avrebbe risposto. – Joshua

risposta

31

Non è possibile. C'è solo un distruttore per classe in C++.

Quello che puoi fare è creare un distruttore privato e poi disporre di diversi metodi pubblici che chiamano il distruttore in modi nuovi e interessanti.

class Foo { 
    ~Foo() { ... } 
public: 
    DestroyFoo(int) { ... }; 
    DestroyFoo(std::string) { ... } 
}; 
+0

non ucciderebbe RAII? – Qberticus

+0

@Qberticus, sì, lo farebbe in qualche modo. Non c'è ancora nulla che impedisca all'OP di creare una classe aggiuntiva che abbia RAII semplice e che distrugga Foo in un modo interessante.Senza ulteriori informazioni dall'OP non posso dirlo. Spero che il PO lo abbia preso in considerazione e ne tenga conto nella sua soluzione. – JaredPar

+2

Questo è privato * distruttore * ... –

1

Non puoi! Ogni classe può avere solo un distruttore. Come potresti averne più di uno? Il distruttore viene attivato automaticamente; non c'è modo che la lingua possa sapere quale chiamare.

I distruttori virtuali, tuttavia, sono un'altra questione.

0

Non è così. Non puoi avere 2 distruttori in una classe.

Cosa stai cercando di realizzare?

1

Il sovraccarico significa avere diverse funzioni con lo stesso nome che richiedono argomenti diversi. Come swap(int &a, int &b) e swap(double &a, double &b). Un distruttore non accetta argomenti. Sovraccaricare non avrebbe senso.

Se è necessario fare cose diverse quando si distrugge un oggetto in base a determinate circostanze, è sufficiente disporre delle istruzioni appropriate if nel distruttore per verificare tali circostanze.

3

Domanda interessante ma l'unica ragione per cui si vorrebbe sovraccaricare un distruttore sarebbe perché si desidera liberare alcune risorse in un distruttore e lasciarle indietro in un altro, giusto?

Fondamentalmente, è possibile ottenere tale comportamento dal proprio distruttore utilizzando un valore booleano aggiuntivo che indica se una risorsa specifica deve essere liberata o meno. Questo booleano verrebbe impostato nel costruttore e/o in uno dei tuoi altri metodi e nel distruttore controllerai se è impostato. Se non è impostato, libererai la risorsa. Altrimenti, lasci la risorsa e probabilmente qualche altra attività la libererà. (Questo ha senso quando si condividono risorse tra più oggetti.)

Il motivo per cui non è possibile sovraccaricare un distruttore è perché il codice non ha la minima idea di quale distruttore deve chiamare quando si distrugge un oggetto . A meno che non chiami male i distruttori ma poi ti stai comportando male! ;-)

0

Non sovraccaricare il distruttore perché non lo si chiama mai. Questo è l'essenza di base di esso. (Da cosa siamo passati in classe.)

Problemi correlati