2014-07-11 9 views
8

Eine gewöhnliche Sache, die ich finde, macht "fast Standard" kopieren Konstruktoren und Zuweisungsoperatoren. Das heißt, ich befinde mich in Situationen, in denen der Compiler Kopier- und Zuweisungsoperatoren für die meisten Datenelemente verwenden würde, aber es gibt ein bestimmtes Datenelement, das anders behandelt werden muss. Dies bedeutet, dass ich explizit einen Kopierkonstruktor/Zuweisungsoperator erstellen muss, der explizit alle Datenelemente mit einfacher Kopiersemantik auflistet. Dies kann für Klassen, in denen es eine große Anzahl von Datenelementen gibt, oder später, wenn Membervariablen hinzugefügt werden, aber nicht zum Kopierkonstruktor/Zuweisungsoperator hinzugefügt werden, ärgerlich werden."fast Standard" kopieren Konstruktor (& Zuweisungsoperator) in C++

Gibt es eine Möglichkeit, dem C++ - Compiler mitzuteilen, dass ein explizit deklarierter Kopierkonstruktor/Zuweisungsoperator wie ein impliziter Operator funktionieren sollte, außer für zusätzlichen Code, der danach ausgeführt wird? (Und ist eine solche Syntax C++ 98 kompatibel, oder benötigt sie C++ 11 oder C++ 14 Unterstützung?)

+16

Implementieren Sie einen richtigen RAII-Wrapper für diesen einen Datenelement, dann würden Standardkonstruktoren für alles funktionieren. –

Antwort

8

Wenn Sie die spezifische Behandlung in einem richtigen RAII-Wrapper isolieren können, wie Igor Tandetnik vorgeschlagen: gehen dafür.

Wenn Sie im Kopierkonstruktor und/oder Zuweisungsoperator noch eine bestimmte Verarbeitung benötigen (z. B. Registrieren der Objekterstellung/-zuweisung in einem Container oder Protokoll), können Sie die Datenelemente gruppieren, für die die Standardkopie erstellt/zugewiesen werden kann eine separate Klasse, die Sie als Basisklasse oder Datenelement verwenden, die Sie als Verbundhandhaben, also:

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; 
}; 

Wenn Sie später Datenelemente hinzufügen, die Sie keine spezifische Behandlung benötigen, können sie einfach in dem x_base .

+1

Dies nutzt den Vorteil, dass der implizit definierte Kopierkonstruktor für eine nicht gewerkschaftlich organisierte Klasse eine Memberly-Kopie seiner Basen und Members ausführt (Standard C++, Abschnitt 12.8 pt 15). Beachten Sie jedoch, dass dies einige Einschränkungen in der Reihenfolge hat, in der die Mitgliederkopie ausgeführt wird. – Christophe