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ą:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
W przypadku GCC daje to następujący komunikat o błędzie:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
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:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
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:
test.cpp: error: use of deleted function
‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
test.cpp: note: ‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
is implicitly deleted because the default definition would
be ill-formed:
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:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
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 .