2013-04-07 7 views
5

Myślę, że to niemożliwe, ale równie dobrze mogę zapytać. Czy mogę zadeklarować prywatny Copy-Constructor i nadal używać domyślnej implementacji?Czy mogę utworzyć konstruktor kopiowania jako prywatny i nadal używać domyślnej implementacji

Tło: Mam klasę z bardzo dużymi wektorami i nie chcę wywoływać konstruktora kopii z wyjątkiem jednej funkcji składowej. Korzystanie ze standardowego publicznego narzędzia do kopiowania może powodować problemy z błędami, np. zapomnienie odniesienia w iteracji (foreach(Type el,vectOfBigObjects) zamiast foreach(Type const& el,vectOfBigObjects)). Dlatego chcę zachować standardową kopię konsruktora, ale po prostu uczynić ją prywatną.

Czy jest to możliwe bez przepisywania definicji makulatury?

Odpowiedz

11

Czy jest to możliwe bez przepisywania definicji makulatury?

W C++ 11, tak. Po prostu trzeba zadeklarować konstruktor i oznaczyć ją jako domyślnie:

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

To będzie zdefiniować konstruktor kopiujący, które mają taką samą definicję w postaci domyślnie generowany jeden, ale będzie private. Na przykład:

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

Oto live example.

Należy zauważyć, że konstruktor deklarowany przez użytkownika (w tym konstruktor kopiowania) w definicji klasy blokuje domyślne generowanie domyślnego konstruktora, nawet jeśli jego definicja jest domyślna. Dlatego na przykład musiałem jawnie zadeklarować domyślny konstruktor X w powyższym przykładzie.

Powiązane problemy