2017-11-27 21 views
10

के रूप में निर्दिष्ट बेस क्लास के सार्वजनिक स्थैतिक सदस्यों तक पहुंच मैं सी ++ सीख रहा हूं। प्रलेखन docs.microsoft.com/en-us/cpp/cpp/member-access-control-cpp कहता है:निजी

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

हालांकि

, निम्नलिखित कोड पिछले उद्धरण कारण त्रुटि C2247 निम्नलिखित थोड़ा उदाहरण से समायोजित:

'बेस :: वाई' सुलभ नहीं है क्योंकि 'Derived1' का उपयोग करता है 'निजी' 'से प्राप्त करना बेस '।

मैं इस स्थिति के साथ किसी भी मदद की सराहना करता हूं।

class Base 
{ 
public: 
    int x;    
    static int y;  
}; 

class Derived1 : private Base 
{ 
}; 

class Derived2 : public Derived1 
{ 
public: 
    int ShowCount();  
}; 

int Derived2::ShowCount() 
{ 
    int cCount = Base::y;  
    return cCount; 
} 
+2

दायरे को सही करने के लिए ':: बेस :: वाई' का उपयोग करें। – Peter

+1

मुझे लगता है कि माइक्रोसॉफ्ट का उदाहरण टूटा हुआ है। – molbdnilo

उत्तर

15

कि प्रलेखन एक छोटे से भ्रामक है।

सही संकलक व्यवहार दोनोंDerived में दुर्गम हो, अगर आपको लगता है कि संकेतन का उपयोग static सदस्य तक पहुँचने के लिए प्रयास करने के लिए Base::yऔरBase::xकरने के लिए है।

लेकिन आप एक और गुंजाइश संकल्प ऑपरेटर का उपयोग करके वैश्विक नामस्थान (जिससे Derived1 circumventing) के माध्यम से वहां पहुंच सकते हैं:

int Derived2::ShowCount() 
{ 
    int cCount = ::Base::y;  
    return cCount; 
} 
अंत में

, मत भूलना के लिए अगर आप कहींy को परिभाषित लिंक मंच सफल होना चाहते हैं।

+4

नाम लुकअप नियमों का पथ-खोज कई बार निराशाजनक होता है। – StoryTeller

+1

@ बाथशेबा क्या आप उपर्युक्त उदाहरण में एक और स्कोप रिज़ॉल्यूशन कार्य जोड़ने के बारे में स्पष्टीकरण जोड़ सकते हैं। यह मेरे लिए बहुत उपयोगी होगा। धन्यवाद! –

+1

@ प्रवराजवालेकर: मैंने इसे जोड़ा है। अनौपचारिक रूप से, यदि आप * वैश्विक नामस्थान * के माध्यम से जाते हैं, तो आप 'व्युत्पन्न 1' के माध्यम से जाने के बजाय सीधे 'बेस' तक पहुंचते हैं। – Bathsheba

2

इस बदलें:

Base::y; 
इस के लिए

;

::Base::y; 
संबंधित मुद्दे