2010-12-24 10 views
10

इस तरीके से मैं इस मूल विधि और अभिभावक चर को कैसे एक्सेस कर सकता हूं?सी ++: अभिभावक विधियों और चरों तक पहुंच

class Base 
{ 
public: 
    std::string mWords; 
    Base() { mWords = "blahblahblah" } 
}; 

class Foundation 
{ 
public: 
    Write(std::string text) 
    { 
     std::cout << text; 
    } 
}; 

class Child : public Base, public Foundation 
{ 
    DoSomething() 
    { 
     this->Write(this->mWords); 
     // or 
     Foundation::Write(Base::mWords); 
    } 
}; 

धन्यवाद।

संपादित करें: और यदि अस्पष्टता है तो क्या होगा?

उत्तर

10

दोनों वाक्यविन्यास आप अपने कोड में उपयोग (this->... और योग्य नाम) केवल आवश्यक विशेष रूप से जब वहाँ अस्पष्टता या कुछ अन्य नाम देखने मुद्दा, नाम छुपा, टेम्पलेट आधार वर्ग आदि

की तरह है वहाँ कोई अस्पष्टता नहीं है जब कर रहे हैं या अन्य समस्याएं जिन्हें आपको इनमें से किसी भी वाक्यविन्यास की आवश्यकता नहीं है। आपको बस एक उदाहरण के लिए एक सरल अयोग्य नाम है, जैसे Write। बस Write, this->Write नहीं और Foundation::Write नहीं। यह mWords पर लागू होता है।

आईई। आपके विशिष्ट उदाहरण में एक सादा Write(mWords) ठीक काम करेगा।


के रूप में

DoSomething(int mWords) { 
    ... 

तो यह स्थानीय mWords पैरामीटर विरासत में मिला छिपाने वर्ग के सदस्य mWords ऊपर समझने के लिए, यदि आपके DoSomething विधि mWords पैरामीटर था, और आप या तो

उपयोग करने के लिए होगा
DoSomething(int mWords) { 
    Write(this->mWords); 
} 

या

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

अपने इरादे को सही तरीके से व्यक्त करने के लिए, यानी छिपाने के माध्यम से तोड़ने के लिए।


यदि आपका Child वर्ग के रूप में भी

class Child : public Base, public Foundation 
{ 
    int mWords 
    ... 

तो इस नाम को विरासत mWords छिपाने में अपनी ही mWords सदस्य था। इस मामले में this->mWords दृष्टिकोण आप उचित नाम सामने लाने के लिए मदद नहीं होता है, और यदि आपका आधार वर्ग के दोनों एक mWords सदस्य था आप समस्या को हल करने

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

योग्य नाम का उपयोग करना चाहते हैं ,

class Base { 
public: 
    std::string mWords; 
    ... 
}; 

class Foundation { 
public: 
    int mWords; 
    ... 

में के रूप में तो Child::DoSomething में mWords नाम अस्पष्ट होगा, और आपको बस इतना करना होगा

अस्पष्टता को हल करने के लिए 210


लेकिन, फिर से, अपने विशिष्ट उदाहरण में, जहां कोई अस्पष्टता नहीं है और कोई नाम यह सब छिपा पूरी तरह से अनावश्यक है।

+0

समझ में आता है। धन्यवाद! –

0

मुझे लगता है कि यह सबसे आम तरीका है:

Write(mWords); 

जब तक आप अस्पष्टता में चलाने।

यदि अस्पष्टता या छाया हो रही है क्योंकि आप किसी विशेष (विशेष) बेस क्लास में कुछ चाहते हैं लेकिन किसी अन्य बेस क्लास (या इस वर्ग) में कुछ इसे छुपाता है, तो Base::name वाक्यविन्यास का उपयोग करें।

यदि कोई स्थानीय चर आपके सदस्यों में से एक को छाया दे रहा है, तो this-> का उपयोग करें, हालांकि सामान्य रूप से आपको इस स्थिति से बचने की कोशिश करनी चाहिए।

मैं देखने के लिए एक ही रास्ता लगता है यह इन कि काम करता है और करता है के पहले उपयोग करने के लिए आप क्या चाहते हो सकता है पर: (यानी स्थानीय लोगों में इस तरह है कि वे सदस्यों शैडो नामकरण से बचने की कोशिश):

  1. name
  2. this->name
  3. Base::name
+0

हाँ, मुझे अस्पष्टता से निपटना पड़ सकता है ... मैं अपनी मूल पोस्ट में स्पष्टीकरण दूंगा। –

0

चूंकि कोई नामकरण विरोध हो, तो बस Write(mWords) का उपयोग करें। यदि आपके पास स्थानीय वेरिएबल्स हैं जो संघर्ष करते हैं, या जब नाम छिपाए जाते हैं तो दूसरे 2 का उपयोग करें।

+0

यदि कोई संघर्ष है, तो आप किस विधि का अनुशंसा करते हैं जिसका मैं उपयोग करता हूं? –

+0

और "जब नाम छिपाए जाते हैं" से आपका क्या मतलब है? –

+0

यदि यह स्थानीय चर और सदस्य चर के बीच एक संघर्ष है (उदा। आपकी कक्षा में सदस्य चर 'i' है, और आपकी विधि स्थानीय चर' i' का भी उपयोग करती है), 'this' का उपयोग करें। यदि 'ए 'एक समारोह' एफ' घोषित करता है, और' बी 'को 'ए' प्राप्त होता है और' एफ' भी घोषित करता है, और आप 'बी' से 'ए' 'एफ' को कॉल करना चाहते हैं, तो' ए :: f'। – lijie

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