2016-03-15 9 views
9

हैलो मैं सोच रहा हूं कि सी ++ मानक हमें बाहरी वर्ग के निजी क्षेत्रों तक पहुंचने के लिए नेस्टेड कक्षाओं में क्यों अनुमति देता है, जबकि यह बाहरी वर्ग के आंतरिक वर्ग के निजी क्षेत्रों तक पहुंचने से मना करता है। मैं समझता हूं कि यह उदाहरण:सी ++ बाहरी कक्षा का उपयोग आंतरिक वर्ग का निजी - क्यों मनाया गया

class OuterClass{ 
public: 
    class InnerClass{ 
    public: 
     void printOuterClass(OuterClass& outer) {cout << outer.m_dataToDisplay;}; 
    }; 
private: 
    int m_dataToDisplay; 
}; 

, ठीक है, क्योंकि बात है, कि इनर वर्ग कभी कभी जटिल हो सकता है। लेकिन मुझे लगता है इस परिदृश्य पर भी ठीक है:

class Algorithm{ 
public: 
    class AlgorithmResults{ 
    public: 
     void readAlgorithmResult(); 
    private: 
     void writeAlgorithmResult(); 
    }; 

    void calculate(AlgorithmResults& results, Arguments...){ 
     //calculate stuff 
     results.writeAlgorithmResult(results); 
    } 
}; 

मेरे लिए इस संरचना एकदम सही समझ में आता है, हालांकि यह C++ अनुमति नहीं है। मैंने यह भी देखा कि कुछ समय के लिए जावा में दोनों की अनुमति थी, लेकिन अब दूसरा उदाहरण भी वर्जित है। कारण क्या है, कि पहले उदाहरण की अनुमति है और दूसरा अस्वीकार कर दिया गया है?

उत्तर

15

अनिवार्य रूप से, कोड के भीतर एक दायरे में उस दायरे में पहले घोषित चीजों तक पहुंच है (जब तक कि वे छाया न हों)। कोड के बाहर एक दायरे में दायरे के अंदर चीजों तक पहुंच नहीं है। जैसे एक घुंघराले ब्रेसिज़ ब्लॉक के बाद कोड, उस ब्लॉक के अंदर घोषित चर के लिए उपयोग नहीं है।


दूसरा उदाहरण के लिए, बस बनाने Algorithm एक AlgorithmResults की friend:

class AlgorithmResults 
{ 
    friend class Algorithm; 
+5

क्षमा करें, मैंने दोस्ती उलटा और उसे ठीक करना पड़ा। यह अभी तक एक और प्रमाण है कि SO को पोस्ट करने से पहले कॉफी की आवश्यकता है! –

4

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

11.7/1 नेस्टेड वर्गों [class.access.nest]

एक नेस्टेड वर्ग एक सदस्य है और इस तरह के किसी अन्य सदस्य के रूप में ही पहुँच अधिकार है से

दूसरी ओर, बाहरी वर्ग में नेस्टेड कक्षा पर विशेष पहुंच अधिकार नहीं हैं, वे केवल सामान्य संबंध हैं।

के सदस्यों के पास एक संलग्न वर्ग के पास घोंसला वाले वर्ग के सदस्यों के लिए कोई विशेष पहुंच नहीं है; सामान्य पहुंच नियम (खंड 11) का पालन किया जाएगा।

+0

यह सिर्फ तथ्यों को दोहराता है, लेकिन ओपी चाहता है कि तथ्यों को उचित ठहराया जाए (हालांकि मुझे नहीं लगता कि यह एक विशेष रूप से अच्छा सवाल है)। –

+0

@BarryTheHatchet मैंने इसे आंतरिक कक्षा के विभिन्न विचारों से बाहरी वर्ग तक और वर्ग से आंतरिक कक्षा तक समझाया। अस्पष्ट? – songyuanyao

+0

आपने नियमों को बहुत अच्छी तरह से समझाया।मुझे नहीं लगता कि ओपी क्या मांग रहा था। –

5

काउंटर प्रश्न: आप इसे क्यों अनुमति देना चाहते हैं?

आप एक बाहरी वर्ग की जरूरत निजी internals 'एक आंतरिक वर्ग की पहुंच है, तो आप दोस्ती कर सकते हैं:

class Foo { 
    public: 
      class Frob { 
        friend class Foo; 
        int privateDataMember; 
      }; 

      Foo() { 
        Frob frob; 
        frob.privateDataMember = 3735928559; 
      } 
    }; 

सी ++ unfriend करने के लिए कोई उपकरण है, तो एक बाहरी वर्ग चोरी होगा करने के लिए डिफ़ॉल्ट निजी उपयोग की इजाजत दी एक वर्ग डिजाइन उपकरण और उपज डिफ़ॉल्ट encapsulation कम कर दिया।

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