2013-04-07 2 views
5

Ich denke, das ist unmöglich, aber ich könnte genauso gut fragen. Kann ich einen privaten Kopierkonstruktor deklarieren und trotzdem die Standardimplementierung verwenden?Kann ich den Kopierkonstruktor privat machen und immer noch die Standardimplementierung verwenden

Hintergrund: Ich habe eine Klasse mit sehr großen Vektoren und ich möchte den Kopierkonstruktor mit Ausnahme einer Elementfunktion nicht aufrufen. Die Verwendung eines üblichen öffentlichen copy-ctor könnte leicht zu Fehlern wie z.B. Vergessen einer Referenz in einer Iteration (foreach(Type el,vectOfBigObjects) anstelle von foreach(Type const& el,vectOfBigObjects)). Daher möchte ich den Standard-Copy-Constructor beibehalten, ihn aber nur privat machen.

Ist dies möglich, ohne die Copy-Ctors-Definition neu zu schreiben?

Antwort

11

Ist dies möglich, ohne die Copy-Ctors-Definition neu zu schreiben?

In C++ 11, ja. Sie müssen nur den Konstruktor deklarieren und markieren als vorbelegt:

struct X 
{ 
    // ... 
private: 
    X(X const&) = default; 
}; 

Dadurch wird eine Kopie Konstruktor definieren, welche die gleiche Definition als implizit eine erzeugt haben würde, wird aber private sein. Zum Beispiel:

struct X 
{ 
    X() { } // Required because a user-declared constructor in 
      // the definition of X inhibits the implicit generation 
      // of a default constructor (even if the definition is 
      // defaulted!) 

    void foo() 
    { 
     // ... 
     X tmp = *this; // OK! 
     // ... 
    } 

private: 

    X(X const&) = default; // Default definition, accessible to 
          // member functions of X only! 
}; 

int main() 
{ 
    X x; 
    // X x2 = x; // ERROR if uncommented! 
} 

Hier ist ein live example.

Beachten Sie, dass ein benutzerdefinierter Konstruktor (einschließlich Kopierkonstruktor) in einer Klassendefinition die implizite Generierung eines Standardkonstruktors verhindert, auch wenn seine Definition standardmäßig ist. Aus diesem Grund musste ich beispielsweise im obigen Beispiel den Standardkonstruktor X explizit deklarieren.

Verwandte Themen