Questione : Operatore di assegnazione perfetto 1

Ciao, il

How dovrebbe io fare l'operatore di assegnazione perfetto per questo codice categoria?

class TAAA : TSuperAAA
{
TBBB* b1_;
   TBBB* b2_;
}; il
TBBB è monomorphic e b1_, punto something.
di b2_ class= del

Risposta : Operatore di assegnazione perfetto 1

>> particolarmente quando Infinity08: ha scritto che la garanzia non è necessaria nel sistema reale (se capissi).

No, non ho significato che una garanzia non è necessaria. Che cosa ho detto in risposta all'alberino dell'atmosfera era che preferisco occuparmi delle condizioni di errore diversamente che il suo metodo.

Ci sono due metodi qui (ho aggiunto i miei propri pensieri personali ugualmente):

(a) Provare a scrivere l'operatore di assegnazione per lasciare l'oggetto in una condizione valida per ogni piano d'azione possibile. Ciò è estremamente duro basicamente impossibile, o per lo meno. Ci è troppe variabili in questione e troppo piano d'azione possibile di errore. Additionaly, questo genere di metodo aggiunge le limitazioni a che cosa il codice può fare, che non è desiderabile in molti casi.

(b) evita la complessità aggiunta che viene con il metodo precedente e preferibilmente rinvia la responsabilità al codice di chiamata. Il meccanismo delle eccezioni è adatto perfettamente per quello. Ancora, è solitamente il codice di chiamata che conosce il meglio come occuparsi di un errore (l'uno o l'altro provando a ripararla, ad ignorare esso, a venire a mancare con garbo, ecc.), di modo che è un altro motivo preferire questo metodo.

Il secondo metodo è che cosa suggerisco per il caso generale, perché è più flessibile e più facile realizzare ed una volta fatto correttamente, non perdete nulla per quanto riguarda la sicurezza di codice.
Il primo metodo è utile in determinati casi specifici, ma otterrete rapidamente sepolto nelle complessità se provate ad usarli dappertutto heh.



>> La mia ispirazione per la fabbricazione del questo alberino è

È un articolo piacevole ed effettivamente copre molti dei trabocchetti di operatori di assegnazione.


>> I e stava domandando che cosa è risposta corretta per quello.

Noterete che l'articolo comincia con uno dei sensi corretti avvicinarsi ad un operatore di assegnazione. L'unica differenza con il codice che ho inviato più presto, sono che il loro operatore di assegnazione pulisce correttamente dopo se nel caso la ripartizione di memoria venga a mancare.

Quello è necessario buon, ma non interamente. Il distruttore dei codici categoria è destinato per pulire un oggetto, in modo da preferisco lasciare quella responsabilità là, invece di diffusione esso fuori all over i metodi dei codici categoria.

Verso l'estremità dell'articolo, i metodi differenti sono discussi anche.


Superando il mio codice più iniziale ancora, ho macchiato un errore comunque. “La cancellazione b1_; „ la linea dovrebbe essere seguita dall'“b1_ = 0; „ linea (similmente per b2_). Sembro stavo scriv un heh a macchina troppo veloce della punta. Così, diventa:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
TAAA& TAAA:: operator= (taaa del const TAAA&) {
    TSuperAAA:: operator= (taaa);                   chiamata di // l'operatore di assegnazione per il codice categoria basso
    se (questo! = &taaa) {                          controllo di // per l'assegnazione di auto
        cancellazione b1_;
        b1_ = 0;
        b1_ = nuovo TBBB (taaa.b1_);
        cancellazione b2_;
        b2_ = 0;
        b2_ = nuovo TBBB (taaa.b2_);
    }
    *this di ritorno;
}
Altre soluzioni  
 
programming4us programming4us