Elenco di controllo per la scrittura del costruttore di copie e dell'operatore di assegnazione in C ++

StackOverflow https://stackoverflow.com/questions/214891

Domanda

Scrivi un elenco di attività che un costruttore di copie e un operatore di assegnazione devono svolgere in C ++ per mantenere la sicurezza delle eccezioni, evitare perdite di memoria ecc.

È stato utile?

Soluzione

Prima di tutto assicurati di avere davvero bisogno di supportare la copia. Il più delle volte non è così, e quindi disabilitare entrambe è la strada da percorrere.

A volte, dovrai comunque fornire la duplicazione su una classe da una gerarchia polimorfica, in quel caso: disabilitare l'operatore di assegnazione, scrivere un costruttore di copie (protetto?) e fornire una funzione clone virtuale ().

Altrimenti, nel caso in cui si stia scrivendo una classe di valore, si ritorna nella terra della Forma canonica ortogonale di Coplien. Se hai un membro che non può essere banalmente copiato, dovrai fornire un costruttore di copia, un distruttore, un operatore di assegnazione e un costruttore predefinito. Questa regola può essere perfezionata, ad esempio: La legge dei due grandi

Consiglio anche di dare un'occhiata alle Domande frequenti sul C ++ relative agli operatori di assegnazione e al idioma copia-e-scambia e su GOTW .

Altri suggerimenti

Le versioni generate dal compilatore funzionano nella maggior parte delle situazioni.

Devi pensare un po 'di più al problema quando il tuo oggetto contiene un puntatore RAW (un argomento per non avere puntatori RAW). Quindi hai un puntatore RAW, la seconda domanda è possiedi il puntatore (viene eliminato da te)? In tal caso, dovrai applicare la regola di 4.

Possedere più di 1 puntatore RAW diventa sempre più difficile da eseguire correttamente (L'aumento della complessità non è neanche lineare [ma è osservazionale e non ho statistiche reali per sostenere tale affermazione]). Quindi, se hai più di 1 puntatore RAW, pensa a racchiuderli ciascuno nella sua classe (una qualche forma di puntatore intelligente).

Regola di 4: se un oggetto è il proprietario di un puntatore RAW, è necessario definire i seguenti 4 membri per assicurarsi di gestire correttamente la gestione della memoria:

  • Constructor
  • Copia costruttore
  • Operatore di assegnazione
  • Destructor

Come li definirai dipenderà dalle situazioni. Ma cose a cui prestare attenzione:

  • Costruzione predefinita: imposta il puntatore su NULL
  • Costruttore di copie: utilizzare l'ideum Copia e Scambia per fornire alla "Garanzia di eccezionale eccezione"
  • Operatore di assegnazione: controlla l'assegnazione a sé
  • Distruttore: proteggi le eccezioni che si propagano dal distruttore.

prova a leggere questo.

http://www.icu-project.org/docs /papers/cpp_report/the_anatomy_of_the_assignment_operator.html

è un'ottima analisi dell'operatore di assegnazione

Non ho idea dell'eccezione in modo sicuro qui, ma vado in questo modo. Immaginiamo che sia un wrapper di array basato su modelli. Spero che sia d'aiuto :)

Array(const Array& rhs)
    {
        mData = NULL;
        mSize = rhs.size();
        *this = rhs;
    }

    Array& operator=(const Array& rhs)
    {
        if(this == &rhs)
        {
            return *this;
        }

        int len = rhs.size();

        delete[] mData;

        mData = new T[len];

        for(int i = 0; i < len; ++i)
        {
            mData[i] = rhs[i];
        }

        mSize = len;

        return *this;
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top