2011-01-28 20 views
26

किसी भी कक्षा में किसी भी गैर-लोकप्रिय सदस्य को जोड़ने से प्रतिलिपि निर्माण और असाइनमेंट ऑपरेटर की स्वचालित पीढ़ी को रोका जा सकेगा। बढ़ावा देने के लिए विरासत को विरासत की आवश्यकता क्यों होती है?बढ़ावा क्यों देता है :: noncopyable विरासत की आवश्यकता है

मुझे लगता है मैं नहीं के रूप में

class MyUtility : public MyBase , private noncopyable 
{ 
    ... 
}; 

डेव इब्राहीम एक स्मार्ट लड़का है करने के लिए विरोध के लिए

class MyUtility : public MyBase 
{ 
    noncopyable guard; 
    ... 
}; 

मेरी शैलीगत वरीयता में अकेला हूँ, तो वह शायद इस संभावना पर विचार। मैं क्या खो रहा हूँ? विरासत क्या हासिल करता है?

उत्तर

33

क्योंकि sizeof(boost::noncopyable)!=0। तो इस मामले में आपका वर्ग का आकार बड़ा होगा।

Here आप खाली बेस अनुकूलन के बारे में पढ़ सकते हैं। (खंड "4.7: खाली सदस्य अनुकूलन" देखें)।

संपादित करें: तथ्य यह है कि गैर-लोकप्रिय लोगों के पास सार्वजनिक निर्माता नहीं हैं, यह किसी भी अन्य उपयोग के लिए बेकार बनाता है, जबकि सार्वजनिक कन्स्ट्रक्टर के साथ कक्षाओं का उपयोग अन्य गलत उद्देश्यों के लिए भी किया जा सकता है। यह एक और कारण है, इस दृष्टिकोण को बढ़ावा देने का बढ़ावा क्यों दिया।

+4

"खाली बेस अनुकूलन" जो लोग इस सवाल का जवाब :) –

+1

@Matthieu एम समझा नहीं था के लिए compilers करने की अनुमति दी करने के लिए अनिवार्य संदर्भ किया हुआ :)। – UmmaGumma

+0

मैं इसे उत्तर के रूप में स्वीकार कर रहा हूं, लेकिन यह इस तथ्य का भी जिक्र करना चाहिए कि बूस्ट का दृष्टिकोण स्पष्ट रूप से कॉपी कार्यक्षमता प्रदान करने के लिए सबक्लासिंग को रोकता है। –

23

यदि आप सदस्य के रूप में noncopyable का उपयोग कर सकते हैं, तो इसे एक सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर और विनाशक की आवश्यकता होगी। फिर लोग noncopyable के उदाहरण बना सकते हैं या यहां तक ​​कि विनाशक वर्चुअल होने के बिना इसे पॉलिमॉर्फिक बेस क्लास के रूप में भी उपयोग कर सकते हैं। किसी भी सार्वजनिक सदस्यों के बिना कार्यान्वयन बस यह सुनिश्चित करता है कि इसे पूरी तरह से नीति वर्ग के रूप में उपयोग किया जाता है।

+3

मुझे लगता है कि यह सही जवाब है, ईबीओ के बारे में नहीं। –

4

व्यक्तिगत रूप से, मैं बूस्ट वाक्यविन्यास पसंद करता हूं। विरासत पूरे वर्ग में कुछ गुण या सुविधाओं को जोड़ने का एक तरीका है, और गैर-लोकप्रियता ऐसी सुविधा है। अपरिवर्तनीय सदस्य मुश्किल लगता है (आप वास्तव में किसी भी सदस्य को जोड़ना नहीं चाहते हैं, यह एक चाल है)। विरासत का उपयोग ठीक उसी प्रकार किया जाता है जिसके लिए इसे डिजाइन किया गया है।

4

सबसे स्पष्ट कारण यह है कि व्युत्पन्न वर्ग "isA" noncopiable है, इसलिए विरासत का उपयोग सबसे अधिक समझ में आता है। तथ्य यह है कि इस तरह से इसका उपयोग कक्षा के आकार में वृद्धि नहीं करता है आज भी एक विचार है (लेकिन मुझे लगता है कि खाली बेस क्लास अनुकूलन से पहले गैर-प्रयोज्य)।

+0

कंपाइलर ले-आउट क्लास ऑब्जेक्ट्स को कब व्युत्पन्न किया गया था जैसे बेस सबोबजेक्ट सदस्य उपनिवेश था? ऐसा लगता है कि बेस सबोबजेक्ट की पूंछ पैडिंग का पुन: उपयोग दशकों (कम से कम एक) के लिए अस्तित्व में था। – curiousguy

0

आप private पद छोड़ देते हैं, तो यह लगभग अंग्रेजी की तरह हो जाता है:

// English: this is my car, it is not copyable 
class MyCar: noncopyable {}; 

// my truck is noncopyable, did i mention it's also a vehicle? 
class MyTruck: noncopyable, public MyVehicle {}; 

// My airplane is a vehicle, BTW it's not copyable 
class MyAirplane: public MyVehicle, noncopyable {}; 
संबंधित मुद्दे