2010-04-22 12 views
16

हाय,प्रश्न ++ भीतरी वर्ग

सी ++ भीतरी कक्षा में,

class A { 
    public: 
     void f1(); 
    private: 
     void f2(); 
    class B { 
     private void f3(); 
    }; 

} 

एक आंतरिक वर्ग (बी) अपनी मूल वर्ग (ए) के लिए सूचक है करता है? (जैसे जावा में करता है)। और बी बी अपने मूल वर्ग सार्वजनिक/निजी विधि (जैसे जावा में करता है) कह सकता है।

धन्यवाद।

उत्तर

28

नहीं - सी ++ में, घोंसले के वर्ग केवल कक्षाओं के अर्थशास्त्र नहीं, नाम और दृश्यता को प्रभावित करते हैं। जहां तक ​​जेनरेट किया गया कोड जाता है, नेस्टेड क्लास उस से अलग नहीं है जो घोंसला नहीं है।

कि सभी

बदल गया है दृश्यता और नाम (उदाहरण के लिए अगर यह बाहरी वर्ग के एक private: खंड में है, यह बाहर की दुनिया को दिखाई नहीं है, और अगर यह एक public: खंड में है, यह दिखाई दे रहा है, लेकिन (बेशक) इसे नाम देने के लिए आप outer_class::inner_class का उपयोग करें। हालांकि यह अभी भी एक पूरी तरह से अलग वर्ग है - उदाहरण के लिए, आप बाहरी वर्ग का कोई उदाहरण बनाये बिना भीतरी कक्षा का उदाहरण बना सकते हैं।

संपादित करें: क्षमा करें, मुझे इसका हिस्सा याद आया आपका प्रश्न। सी ++ 0x में, आंतरिक वर्ग के बाहरी वर्ग के निजी हिस्सों तक पहुंच होती है - संक्षेप में, ऐसा लगता है कि बाहरी वर्ग ने आंतरिक वर्ग को अपने मित्र के रूप में घोषित कर दिया है, इसलिए निजी नाम दिखाई दे रहे हैं, लेकिन आप अभी भी इसे कुछ पास करने की जरूरत है बाहरी वर्ग के किसी भी गैर-स्थैतिक सदस्य कार्यों का आह्वान करने से पहले बाहरी वर्ग की किसी वस्तु के संदर्भ की तरह।

हालांकि यह अभी तक मामला नहीं माना जाता है, मुझे विश्वास है कि अधिकांश कंपाइलर्स पहले से ही इस विशेष भाग को लागू करते हैं। सं
यह माता-पिता निजी सदस्यों के लिए उपयोग किया है::

+4

ऐसा प्रतीत होता है यह C++ 0x में बदल रहा है में पहुँच सकते हैं। सी ++ 03 कहता है: "नेस्टेड क्लास के सदस्यों के पास एक संलग्न वर्ग के सदस्यों के लिए कोई विशेष पहुंच नहीं है।" सी ++ 0 एक्स एफसीडी का कहना है: "एक नेस्टेड क्लास एक सदस्य है और इस तरह के किसी भी अन्य सदस्य के समान अधिकार अधिकार हैं।" (§11.8/1 दोनों)। (परिवर्तन सीडब्ल्यूजी दोष 45 और 4 9 4 द्वारा पेश किया गया था: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45 और http://www.open-std.org/ jtc1/sc22/wg21/docs/cwg_defects.html # 494) –

+0

अच्छा - यह 'मित्र वर्ग {' लिखने के आग्रह को हटा देता है, जो कि कुछ कंपाइलर्स द्वारा समर्थित है, लेकिन स्पष्ट रूप से नेस्टेड क्लास को सदस्य नहीं बनाता है! – Potatoswatter

+1

@Potato: दिलचस्प बात यह है कि सख्त सी ++ 03 मोड में भी कमौ सी ++ 03 भाषा का पालन नहीं करता है। इससे मुझे विश्वास होता है कि (ए) सी ++ 03 भाषा का पालन करने के किसी कारण के लिए यह असंभव है (हालांकि मैंने अभी तक यह नहीं पता लगाया है कि क्यों, ठीक है, उपर्युक्त डीआर में उल्लिखित उल्लेख के अलावा), और (बी) यह संभावना है कि कोई भी वास्तव में सी ++ 03 भाषा का पालन नहीं करता है :-)। –

7

नहीं, कक्षा बी में कक्षा ए के लिए कोई सूचक नहीं है, जब तक कि आप इसे स्पष्ट रूप से जोड़ नहीं देते।

0

यह माता पिता के लिए एक सूचक है

की क्रमबद्ध मैं इसे एक्सेस है, तो अच्छी तरह से मानक में निर्धारित नहीं है लगता है कि मैं हो सकता है गलत।
लेकिन आप जी ++

#include <iostream> 

class X 
{ 
    class Y 
    { 
     public: 
      Y(X* p) 
       :parent(p) 
      {} 
      void TryY() 
      { 
       // Access a private member of X 
       ++(parent->value); 
      } 

     private: 
      X* parent; 
    }; 

    public: 
     X() 
      :y(this) 
     { 
      value = 4; 
     } 

     void TryY() 
     { 
      y.TryY(); 
      std::cout << value << std::endl; 
     } 
    private: 
     Y y; 
     int value; 

}; 

int main() 
{ 
    X x; 
    x.TryY(); 
} 
+0

यह * §11.8/1 * के अनुसार सी ++ 03 के लिए गलत व्यवहार होना चाहिए। –

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