2012-02-23 18 views
6

कॉपी करना चाहिए, मैं एक अमूर्त वर्ग लिख रहा हूं जो कई अन्य वर्गों के लिए माता-पिता होगा। मैं सोच रहा हूं कि कॉपी कन्स्ट्रक्टर को निजी बनाया जाना चाहिए क्योंकि आप एक अमूर्त वर्ग का उपयोग कर रहे हैं और कॉपी करने के लिए कुछ भी नहीं है। हालांकि, मैं 100% निश्चित नहीं हूं।कन्स्ट्रक्टर को निजी या सार्वजनिक

क्या मैं सही हूं और यदि मुझे नहीं लगता कि यह सार्वजनिक या संरक्षित क्यों होना चाहिए?

उत्तर

8

कॉपी कन्स्ट्रक्टर निजी होना चाहिए यदि आप कक्षा की वस्तुओं की प्रतिलिपि बनाना नहीं चाहते हैं। अन्यथा, यह सार्वजनिक होना चाहिए।

+0

बेस क्लास कन्स्ट्रक्टर के लिए व्युत्पन्न वर्ग की एक प्रति बनाने के लिए असंभव है, इसलिए मुझे समझ में नहीं आता कि यह सार्वजनिक होने के लिए कब समझ जाएगा। –

+0

@MarkRansom मेरा मतलब था [यह] (http://ideone.com/n2ndl), लेकिन लोग अभी भी व्युत्पन्न कक्षा में कॉपी कन्स्ट्रक्टर को कार्यान्वित कर सकते हैं। –

+0

धन्यवाद मैंने ऐसा सोचा। एक अनुवर्ती प्रश्न, क्योंकि यह निजी है और इसका कभी भी उपयोग नहीं किया जाएगा, कॉपी कन्स्ट्रक्टर में कोई कोड होने की आवश्यकता नहीं है क्योंकि इसका कभी भी उपयोग नहीं किया जाएगा। क्या वो सही है? – Aaron

3

कॉपी कन्स्ट्रक्टर निजी बनाकर आप अनजान ऑब्जेक्ट स्लाइसिंग को रोकने में मदद करेंगे, जहां आप व्युत्पन्न वर्ग की एक प्रति बनाते हैं लेकिन उस व्युत्पन्न कक्षा के सभी गुणों को खो देते हैं। व्युत्पन्न कक्षाएं अपनी प्रतिलिपि बनाने वाले रचनाकारों को सार्वजनिक कर सकती हैं और सही काम कर सकती हैं।

एक ऐसा मामला है जहां कॉपी कन्स्ट्रक्टर को निजी के बजाय संरक्षित किया जाना चाहिए, जब सार वर्ग में डेटा सदस्य हों। यह अक्सर नहीं होता है। बेस क्लास बेस क्लास सदस्यों की प्रतिलिपि बना सकता है जबकि व्युत्पन्न वर्ग अपने सदस्यों की प्रतिलिपि बनाता है।

class AbstractBase 
{ 
public: 
    AbstractBase(const std::string &init) : wtf(init) {} 
    virtual ~AbstractBase() {} 
    void DoSomething() = 0; 
protected: 
    AbstractBase(const AbstractBase &r) : wtf(r.wtf) {} 

    const std::string wtf; 
}; 

class Derived : public AbstractBase 
{ 
public: 
    // ... 
    Derived(const Derived &r) : AbstractBase(r), moredata(r.moredata) {} 
private: 
    int moredata; 
}; 
+0

आप सही हैं! मैंने सोचा कि बेस क्लास कॉपी कन्स्ट्रक्टर डिफ़ॉल्ट रूप से बुलाया गया था। जाहिर है आपको इसे स्पष्ट रूप से कॉल करना होगा। क्या गलती है! –

+0

आधार वर्ग द्वारा अमूर्त होने से रोका जा रहा टुकड़ा नहीं है? –

+0

@ फ्रेडलार्सन, चेहरे पर! बेशक आप एक अमूर्त वर्ग को तत्काल नहीं कर सकते हैं। –

6

मुझे लगता है कि protected सबसे अच्छा विकल्प है: यह या नहीं, वस्तु व्युत्पन्न वर्ग के लिए copyable है पर निर्णय छोड़ देता है, जबकि सार श्रेणी स्तर पर नकल पर रोक लगाने, खतरनाक object slicing को रोकने।

+0

मुझे लगता है कि इस मामले में संरक्षित और निजी के बीच का अंतर मूक है, क्योंकि बेस क्लास कॉपी कन्स्ट्रक्टर खाली होगा और उसे कॉल करने की आवश्यकता नहीं होगी। –

+1

@MarkRansom मुझे लगता है कि बेस क्लास की कॉपी कन्स्ट्रक्टर को कॉल करना एक अच्छा विचार है, भले ही आप यह सुनिश्चित कर लें कि यह वर्तमान में खाली है। संकलक इसे तब तक ऑप्टिमाइज़ कर देगा जब तक कि बेस क्लास में कॉपी कन्स्ट्रक्टर खाली रहता है, लेकिन अगर कोई गैर-खाली प्रतिलिपि बनाने वाले को शामिल करने के लिए आधार को दोहराता है, तो व्युत्पन्न कक्षाओं को बदलने की आवश्यकता नहीं होगी। – dasblinkenlight

+0

बहुत अच्छा बिंदु। मैंने उस संभावना को शामिल करने के लिए अपना स्वयं का जवाब संपादित कर लिया है। –

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