यदि आपको एक से अधिक वंशानुक्रम का बुरा नहीं लगता (यह उतना बुरा नहीं है, सब के बाद), तो आप निजी कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर के साथ सरल वर्ग लिख सकते हैं और इसके अतिरिक्त उपवर्ग:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
GCC के लिए यह निम्नलिखित त्रुटि संदेश देता है:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
मैं इसके लिए हर कंपाइलर में काम करने के लिए बहुत निश्चित नहीं हूं, हालांकि। एक संबंधित प्रश्न है , लेकिन अभी तक कोई जवाब नहीं है।
युपीडी:
C ++ 11 में आप NonAssignable
निम्नानुसार कक्षा भी लिख सकते हैं :
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
delete
तैयार किए गए कीवर्ड रोकता सदस्यों डिफ़ॉल्ट-निर्माण किया जा रहा है, ताकि वे एक व्युत्पन्न वर्ग के डिफ़ॉल्ट-निर्माण के सदस्यों में आगे नहीं किया जा सकता। असाइन करने का प्रयास 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:
युपीडी:
बूस्ट में पहले से ही एक ही उद्देश्य के लिए एक वर्ग है, मुझे लगता है कि यह इसी तरह से लागू किया गया है। कक्षा को बुलाया जाता है boost::noncopyable
और इसका उपयोग निम्नलिखित के रूप में किया जाता है:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
अगर आपकी परियोजना नीति इसकी अनुमति देती है तो मैं बूस्ट के समाधान पर ध्यान देने की सलाह दूंगा। अधिक जानकारी boost::noncopyable
के लिए एक और संबंधित प्रश्न भी देखें ।