2011-04-13 15 views
21

आप किस अभ्यास की सिफारिश करेंगे, और क्यों?निजी या सार्वजनिक रूप से बढ़ावा से विरासत :: non_copyable?

class Foo : public boost::noncopyable {}; 

बनाम

class Foo : private boost::noncopyable {}; 

मैं एक बढ़ावा :: noncopyable के रूप में फू का एक उदाहरण का उपयोग करने की आवश्यकता होगी, कल्पना नहीं कर सकते, तो मैं इस मामले में निजी वंशानुक्रम की ओर झुकाव रहा हूँ।

+2

मैं हमेशा करता हूं: 'कक्षा Foo: boost :: noncopyable' :) – UncleBens

उत्तर

24

boost::noncopyablevirtual विनाशक घोषित नहीं करता है, यानी सार्वजनिक विरासत श्रृंखला का आधार नहीं बनाया गया है। हमेशा से निजी तौर पर प्राप्त करें।

3

मुझे लगता है कि उच्च बिंदु से यह public विरासत होना चाहिए। इसे private बनाने के कारण पूरी तरह से तकनीकी हैं।

क्यों? क्योंकि कोई प्रकार कॉपी करने योग्य है या नहीं (और यह boost::noncopyable से विरासत में दिखाया गया है) सार्वजनिक इंटरफ़ेस का हिस्सा है। उदाहरण के लिए यदि विरासत public होगी, तो आप boost::noncopyable से प्राप्त होने वाले प्रकार को जांचने में सक्षम होंगे (फिर "मेटा प्रोग्रामिंग" का उपयोग करके) और उसके बाद इसका कारण कॉपी करने योग्य है या नहीं।

निकोलाई एन Fetissov in his answer to this question बताते हैं कि boost::noncopyablevirtual नाशक नहीं है और इसलिए public आधार वर्ग के रूप में नहीं किया जाना चाहिए। हालांकि यह सामान्य रूप से एक वैध तर्क है, मुझे लगता है कि यह इतना असंभव है कि कोई भी कभी भी boost::noncopyable पर एक ऑब्जेक्ट द्वारा एक ऑब्जेक्ट (और delete) का उपयोग करने का प्रयास करेगा, जो तर्क (इस विशेष मामले में) पूरी तरह अकादमिक बनाता है।

चलो! अगर कोई कोड का दुरुपयोग करने के इच्छुक है कि वह को boost::noncopyable पर पॉइंटर पर उपयोग करता है तो सुरक्षित होने का कोई तरीका नहीं है। निश्चित रूप से आप इसे थोड़ा कठिन बना सकते हैं लेकिन एक प्रोग्रामर इतना निर्धारित है कि वैसे भी कोड का दुरुपयोग करने का कोई और तरीका मिलेगा।

इसके अलावा उस में सी ++ 11 boost::noncopyable कि लगता है की घोषणा के द्वारा कि इस मुद्दे का समाधान कर सकता defaultprotected नाशक:

protected: 
    ~noncopyable() = default; 

इस तरह नाशक की घोषणा करते हुए (क्योंकि हम इसे default बनाया) के बिना किसी अतिरिक्त शुल्क नहीं होनी चाहिए हम delete से boost::noncopyable पर पॉइंटर पर से सुरक्षित हैं।

दूसरी ओर हालांकि यह भी असंभव लगता है कि कोई भी यह जांचने के लिए तैयार होगा कि boost::noncopyable से विरासत की जांच करके कोई प्रकार कॉपी करने योग्य है या नहीं। अधिकतर क्योंकि यह पूर्ण उत्तर प्रदान नहीं करता है। सिर्फ इसलिए कि boost::noncopyable से कोई प्रकार नहीं निकला है इसका मतलब यह नहीं है कि यह कॉपी करने योग्य है।

ध्यान दें कि Boost.Noncopyable docsprivate विरासत का उपयोग करने का सुझाव देता है।

1

Boost document

के अनुसार यह एक निजी आधार के रूप में इस्तेमाल किया जा करने का इरादा है।

संबंधित मुद्दे