La cosa migliore da fare è lanciare un'eccezione. Questo è quello per cui sono lì, e qualsiasi tentativo di duplicare il comportamento che si ottiene è probabile che fallisca da qualche parte.
Se non è possibile utilizzare un'eccezione, per qualche motivo, utilizzare nothrow
. L'esempio nello Standard, 18.4.1.1 comma 9, è:
t* p2 = new(nothrow) T; // returns 0 if it fails
Questo è tecnicamente una forma di nuova collocazione, ma dovrebbe restituire un oggetto completamente formato o un puntatore nullo che è necessario per verificare, se non che nessuno lo farà.
Se la classe può avere un oggetto che è lì ma non correttamente inizializzato, è possibile avere un membro dati che funge da indicatore se la classe è utile o meno. Ancora una volta, nessuno controllerà quella bandiera nel codice live.
Tenere presente che, se è davvero necessario disporre di un'assegnazione che è garantita non fallire, è necessario allocare la memoria prima del tempo e utilizzare il posizionamento nuovo e rimuovere tutte le inizializzazioni che potrebbero essere lanciate in un'altra routine, che qualcuno non riuscirà a chiamare. Tutto ciò che alloca la memoria può fallire, in particolare sui sistemi più limitati che di solito non supportano le eccezioni.
In realtà, le eccezioni sono il modo migliore per andare.
fonte
2009-04-10 14:57:42
Suggerirei di lanciare uno std :: runtime_error, o almeno un'eccezione std :: invece di un const char *. – GManNickG
possibile duplicato di [Come gestire l'errore nel costruttore in C++?] (Http://stackoverflow.com/questions/4989807/how-to-handle-failure-in-constructor-in-c) –