Jika Anda tidak keberatan multiple inheritance (tidak buruk, bagaimana pun juga), Anda dapat menulis kelas sederhana dengan private copy constructor dan operator penugasan dan juga menambahkannya:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
Untuk GCC ini memberikan pesan kesalahan berikut:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
Saya tidak begitu yakin ini bekerja di setiap kompiler. Ada pertanyaan terkait , tetapi belum ada jawaban.
UPD:
Di C ++ 11 Anda juga dapat menulis NonAssignable
kelas sebagai berikut:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
Kata delete
kunci mencegah anggota agar tidak dibangun secara default, sehingga tidak dapat digunakan lebih lanjut dalam anggota yang dibangun dengan standar bawaan. Mencoba menetapkan memberikan kesalahan berikut di 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 sudah memiliki kelas hanya untuk tujuan yang sama, saya kira itu bahkan diimplementasikan dengan cara yang sama. Kelas dipanggil boost::noncopyable
dan dimaksudkan untuk digunakan sebagai berikut:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
Saya akan merekomendasikan menempel pada solusi Boost jika kebijakan proyek Anda mengizinkannya. Lihat juga boost::noncopyable
pertanyaan lain yang terkait untuk informasi lebih lanjut.