Mam klasę :
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
Jak mam go zmodyfikować, aby wyłączyć kod, taki jak:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
i zezwalaj tylko na kod taki jak:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
c++
copy-constructor
Humble Debugger
źródło
źródło
Odpowiedzi:
Możesz ustawić konstruktor kopiujący jako prywatny i nie zapewniać żadnej implementacji:
Lub w C ++ 11, wyraźnie tego zabraniaj:
źródło
delete
słowo kluczowe, chciałbym dodać, co następuje. Moim obecnym nawykiem podczas projektowania nowej klasy jest natychmiastowe działaniedelete
zarówno konstruktora kopiującego, jak i operatora przypisania. Odkryłem, że w zależności od kontekstu są one przeważnie niepotrzebne, a ich usunięcie zapobiega niektórym przypadkom nieoczekiwanego zachowania. Jeśli wystąpi sytuacja, w której może być potrzebny procesor kopiowania, określ, czy można to zrobić za pomocą semantyki przenoszenia. Jeśli jest to niepożądane, należy zapewnić implementację zarówno dla (!) Elementu kopiującego, jak i operatora przypisania. Czy to dobre podejście, zostawię czytelnikowi.Jeśli nie przeszkadza ci wielokrotne dziedziczenie (w końcu nie jest tak źle), możesz napisać prostą klasę z prywatnym konstruktorem kopiującym i operatorem przypisania i dodatkowo podklasować ją:
W przypadku GCC daje to następujący komunikat o błędzie:
Nie jestem jednak pewien, czy zadziała to w każdym kompilatorze. Jest pytanie pokrewne , ale nie ma jeszcze odpowiedzi.
UPD:
W C ++ 11 możesz również napisać
NonAssignable
klasę w następujący sposób:W
delete
Zapobiega słów kluczowych członków z domyślnym jest skonstruowany tak, że nie mogą być stosowane również w domyślnych skonstruowane członków klasy pochodnej jest. Próba przypisania powoduje następujący błąd w GCC:UPD:
Boost ma już klasę tylko do tego samego celu, myślę, że jest nawet zaimplementowany w podobny sposób. Klasa jest wywoływana
boost::noncopyable
i ma być używana w następujący sposób:Poleciłbym trzymać się rozwiązania Boost, jeśli pozwala na to polityka projektu. Aby uzyskać więcej informacji, zobacz także inne
boost::noncopyable
pytanie powiązane .źródło
NonAssignable(const NonAssignable &other);
?delete
składni słowa kluczowego C ++ 11 .delete
je wy , przestaje działać (właśnie sprawdziłem).const Class&
iClass const&
są prawie takie same. W przypadku wskaźników możesz mieć nawetClass const * const
typ.Ustaw jako
SymbolIndexer( const SymbolIndexer& )
prywatne. Jeśli przypisujesz odwołanie, nie kopiujesz.źródło