Birden fazla mirasın sakıncası yoksa (sonuçta o kadar da kötü değil), özel kopya oluşturucu ve atama operatörü ile basit bir sınıf yazabilir ve ek olarak alt sınıflandırabilirsiniz:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
GCC için bu aşağıdaki hata iletisini verir:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
Bunun her derleyicide çalışacağından pek emin değilim. Orada bir olan ilgili soru , ancak henüz hiçbir cevap.
UPD:
C ++ 11'de NonAssignable
sınıfı aşağıdaki gibi de yazabilirsiniz :
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
delete
Bir türetilen sınıfın varsayılan inşa üyeleri de kullanılamaz böylece anahtar kelime önler üyeleri, varsayılan inşa edilmektedir. Atamaya çalışmak GCC'de aşağıdaki hatayı verir:
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 zaten aynı amaç için bir sınıfa sahip, sanırım aynı şekilde uygulandı. Sınıf çağrılır boost::noncopyable
ve aşağıdaki gibi kullanılması amaçlanır:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
Proje politikanız izin veriyorsa Boost'un çözümüne bağlı kalmanızı tavsiye ederim. Daha fazla bilgi için boost::noncopyable
ilgili başka bir soruya da bakın .