2014-07-11 37 views
8

Una cosa comune che mi ritrovo a fare è creare costruttori di copia "quasi predefiniti" e operatori di assegnazione. Cioè, mi trovo in situazioni in cui gli operatori di copia e assegnazione forniti dal compilatore avrebbero funzionato per la maggior parte dei membri dei dati, ma c'è un particolare membro di dati che deve essere gestito in modo diverso. Ciò significa che devo creare esplicitamente un gestore di copia/assegnatore di compiti, incluso elencare esplicitamente tutti i membri di dati che hanno una semplice semantica della copia. Ciò può risultare fastidioso per le classi in cui vi è un discreto numero di membri dati o in un secondo momento quando le variabili membro vengono aggiunte ma non vengono aggiunte all'operatore costruttore/assegnazione copia.Costruttore di copia "quasi predefinito" (& operatore di assegnazione) in C++

C'è un modo per dire al compilatore C++ che un operatore di costruzione/assegnazione copia dichiarato esplicitamente dovrebbe funzionare come implicito, fatta eccezione per qualche altro codice che viene eseguito in seguito? (Ed è compatibile con la sintassi C++ 98 o ha bisogno del supporto C++ 11 o C++ 14?

+16

Implementare un wrapper RAII appropriato per quel membro di dati, quindi i costruttori predefiniti potrebbero funzionare per tutto. –

risposta

8

Se è possibile isolare la gestione specifica in un wrapper RAII adeguato come suggerito da Igor Tandetnik: go per quello.

Se è ancora necessaria l'elaborazione specifica nel costruttore di copia e/o nell'operatore di assegnazione (come registrare la creazione/assegnazione dell'oggetto in un contenitore o registro), è possibile raggruppare i membri dati che possono essere copiati predefiniti costruiti/assegnati in una classe a parte che si utilizza come una classe di base o di un membro di dati, che si gestiscono come compositi, in tal modo:

struct x_base { 
    int a,b,c,d; 
    std::string name; 
}; 

struct x : x_base { 
    x(const x& other) 
     : x_base(other) 
    { 
     descr = "copied "; 
     descr += name; 
     descr += " at "; 
     descr += CurrentTimeAsString(); 
     std::cout << descr << "\n"; 
    } 
    void operator = (const x& other) 
    { 
     x_base::operator =(other); 
     descr = "assigned "; 
     descr += name; 
     descr += " at "; 
     descr += CurrentTimeAsString(); 
     std::cout << descr << "\n"; 
    } 
    std::string descr; 
}; 

Quando si aggiunge successivamente membri di dati che non necessitano di un trattamento specifico, si può semplicemente aggiungere a x_base .

+1

Questo sfrutta il principio che il costruttore di copie implicitamente definito per una classe non unione esegue una copia membro delle sue basi e membri (Standard C++, sezione 12.8 punto 15). Si noti tuttavia che questo ha alcuni vincoli sull'ordine in cui viene eseguita la copia del membro. – Christophe

Problemi correlati