আপনি যদি একাধিক উত্তরাধিকার মনে করেন না (তবে এটি এতটা খারাপ নয়) তবে আপনি প্রাইভেট কপি কনস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটর সহ সাধারণ ক্লাস লিখতে পারেন এবং অতিরিক্তভাবে এটি সাবক্লাস করতে পারেন:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
জিসিসির জন্য এটি নিম্নলিখিত ত্রুটি বার্তা দেয়:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
যদিও প্রতিটি সংকলকটিতে এটি কাজ করার জন্য আমি খুব বেশি নিশ্চিত নই। একটি সম্পর্কিত প্রশ্ন আছে , কিন্তু এখনও কোন উত্তর নেই।
UPD:
সি ++ 11 এ আপনি NonAssignable
নিম্নরূপ ক্লাসও লিখতে পারেন :
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
delete
থেকে শব্দ প্রতিরোধ সদস্যদের ডিফল্ট-নির্মাণ করা হচ্ছে, তাই তারা একটি উদ্ভূত বর্গ ডিফল্ট-নির্মাণ সদস্যদের আরও ব্যবহার করা যাবে না। নিয়োগের চেষ্টা করা জিসিসিতে নিম্নলিখিত ত্রুটিটি দেয়:
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::noncopyable
এবং নিম্নলিখিত হিসাবে ব্যবহার করা বোঝানো হয়:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
যদি আপনার প্রকল্পের নীতিটি এটির অনুমতি দেয় তবে আমি বুস্টের সমাধানটি আটকে রাখার পরামর্শ দেব। আরও তথ্যের জন্য আরেকটি boost::noncopyable
সম্পর্কিত প্রশ্নও দেখুন।