2013-07-17 10 views
5

मैं गया है this article पढ़ रहा की निजी सदस्यों पहुंच सकते हैं, और थोड़ी देर के लिए memberspace मुहावरा के साथ चारों ओर खेल रहा था जब मैं कुछ है कि मुझे इस स्निपेट (जो समस्याओं के बिना संकलित: http://ideone.com/hRiV5B): भीतर हैरान देखाMemberspaces माता पिता वर्ग

class HugeClass 
{ 
    public: 
     struct memberspace 
     { 
      int f() const { return parent.f; } 

      private: 
       friend HugeClass; 
       explicit memberspace(HugeClass & parent) 
       : parent(parent) {} 
       HugeClass & parent; 
     } memberspace; 

     HugeClass() : memberspace(*this), f(42) {} 

    private: 
     int f; 
}; 

मुझे एक संकलक त्रुटि की उम्मीद होगी कि HugeClass::f की पहुंच की अनुमति नहीं है क्योंकि f उस संदर्भ में निजी है।

HugeClassmemberspace के friend है, इसलिए HugeClassmemberspace के निजी निर्माता कॉल कर सकते हैं, लेकिन क्यों यह स्पष्ट रूप से memberspaceHugeClass के friend की घोषणा के बिना दूसरी तरह के आसपास काम करता है?

+0

सदस्यस्थान को विशाल क्लास का हिस्सा माना जाता है और इसलिए पूर्ण पहुंच है। –

उत्तर

6

सी ++ 11 में भाषा नियमों द्वारा।

एक नेस्टेड क्लास एक सदस्य है और इस तरह के किसी अन्य सदस्य के समान पहुंच अधिकार हैं। उदाहरण:

class E { 
    int x; 
    class B { }; 
    class I { 
    B b; // OK: E::I can access E::B 
    void f(E* p, int i) 
    { 
     p->x = i; // OK: E::I can access E::x 
    } 
    }; 
}; 

और सी ++ 03 में था

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

तो, सी ++ 11 से उदाहरण सी ++ 03 कंपाइलर्स के साथ काम नहीं करना चाहिए।

+4

ध्यान दें कि 2011 के बाद से यह आधिकारिक तौर पर मामला है। पुराने मानकों ने विपरीत कहा ("नेस्टेड क्लास के सदस्यों के पास एक संलग्न वर्ग के सदस्यों के लिए कोई विशेष पहुंच नहीं है"), हालांकि कुछ लोकप्रिय कंपाइलर्स कई नियमों का पालन कर रहे हैं वर्षों। –

+0

@ माइकसेमोर धन्यवाद। जवाब – ForEveR

+1

पोस्ट करने से पहले सी ++ 03 मानक पढ़ने का कारण यह बहुत दिलचस्प है। इस पर अधिक जानकारी की तलाश करते समय, मुझे भाषा दोष रिपोर्ट मिली: http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45 उस दस्तावेज़ से, वास्तव में मुझे लगता है कि यह मान्य है सी ++ 03 में (न केवल सी ++ 11), क्योंकि मूल व्यवहार को भाषा दोष माना जाता था – nijansen

1

memberspaceHugeClass का हिस्सा है और कक्षा के अन्य सदस्यों की तरह ही पहुंच है।

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