Per continuare la discussione in Perché i puntatori non sono consigliato durante la codifica con C ++?
Supponiamo di avere una classe che incapsula oggetti che necessitano dell'inizializzazione per essere validi, come un socket di rete.
// Blah manages some data and transmits it over a socket
class socket; // forward declaration, so nice weak linkage.
class blah
{
... stuff
TcpSocket *socket;
}
~blah {
// TcpSocket dtor handles disconnect
delete socket; // or better, wrap it in a smart pointer
}
Il ctor assicura che socket
sia marcato NULL, quindi più avanti nel codice quando ho le informazioni per inizializzare l'oggetto.
// initialising blah
if ( !socket ) {
// I know socket hasn't been created/connected
// create it in a known initialised state and handle any errors
// RAII is a good thing !
socket = new TcpSocket(ip,port);
}
// and when i actually need to use it
if (socket) {
// if socket exists then it must be connected and valid
}
Questo sembra meglio che avere il socket nello stack, averlo creato in uno stato 'in sospeso' all'avvio del programma e quindi dover continuamente controllare alcune funzioni isOK () o isConnected () prima di ogni utilizzo.
Inoltre, se TcpSocket ctor genera un'eccezione, è molto più semplice da gestire nel momento in cui viene creata una connessione Tcp piuttosto che all'avvio del programma.
Ovviamente il socket è solo un esempio, ma mi viene difficile pensare quando un oggetto incapsulato con qualsiasi tipo di stato interno non deve essere creato e inizializzato con new
.