Saya ada kelas :
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
Bagaimana saya memodifikasinya untuk menonaktifkan kode seperti:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
dan hanya izinkan kode seperti:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
c++
copy-constructor
Debugger yang rendah hati
sumber
sumber
Jawaban:
Anda dapat menjadikan konstruktor salinan sebagai pribadi dan tidak memberikan implementasi:
Atau di C ++ 11, secara eksplisit melarangnya:
sumber
delete
kata kunci saya ingin menambahkan yang berikut ini. Kebiasaan kebiasaan saya saat ini ketika merancang kelas baru adalah untukdelete
menyalin konstruktor dan operator penugasan segera. Saya telah menemukan bahwa, tergantung pada konteksnya, sebagian besar tidak perlu dan menghapusnya mencegah beberapa kasus perilaku yang tidak terduga. Jika suatu situasi terjadi di mana copy ctor mungkin diperlukan, tentukan apakah itu dapat dilakukan dengan memindahkan semantik. Jika ini tidak diinginkan, berikan implementasi untuk (!) Copy ctor dan operator penugasan. Apakah ini pendekatan yang baik, saya akan menyerahkan kepada pembaca.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:
Untuk GCC ini memberikan pesan kesalahan berikut:
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: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: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:Saya akan merekomendasikan menempel pada solusi Boost jika kebijakan proyek Anda mengizinkannya. Lihat juga
boost::noncopyable
pertanyaan lain yang terkait untuk informasi lebih lanjut.sumber
NonAssignable(const NonAssignable &other);
?delete
sintaksis kata kunci C ++ 11 .delete
mereka, itu berhenti bekerja (saya baru saja memeriksa).const Class&
danClass const&
sama saja. Untuk pointer Anda bisaClass const * const
mengetik genap .Jadikan
SymbolIndexer( const SymbolIndexer& )
pribadi. Jika Anda menetapkan referensi, Anda tidak menyalin.sumber