2011-04-20 18 views
6

मैं बहुत इस विषय के बारे में उलझन में हूँ, मूल रूप से मैं इस कोड है:इनर कक्षा पहुँच

template <typename T> 
class SListArray 
{ 
public: 
    class const_iterator 
    { 
    public: 
     const_iterator(size_t i_currentNode = -1) 
      :m_position(i_currentNode) 
     { 
     } 

     T const& operator*() const 
     { 
      return m_data[m_position].element; 
     } 

     // ... 

    protected: 
     size_t m_position; 
    }; 

    explicit SListArray(); 

    // ... 

private: 
    std::vector<Node<T>> m_data; 

    // ... 
}; 

इस कोड को मुझे एक संकलक त्रुटि दिखा सकते हैं, इसलिए, मैं यदि संभव हो तो है पता करने के लिए होगा इनर क्लास को बाहरी कक्षा के सदस्यों को acces देने के लिए।

धन्यवाद।

+0

संभावित डुप्लिकेट [क्या आंतरिक वर्ग निजी चर का उपयोग कर सकते हैं?] (Http://stackoverflow.com/questions/486099/can-inner-classes-access-private-variables) –

उत्तर

2

हां, एक दोस्त की घोषणा का उपयोग करें।

private: 
    std::vector<Node<T> > m_data; 
    friend class const_iterator; 

अद्यतन: ओह, और m_data तक आपकी पहुंच को गलत है। आंतरिक वर्ग बाह्य वर्ग के सदस्यों तक बाहरी वर्ग के उदाहरण के लिए सूचक के बिना नहीं पहुंच सकता है। तो आपको बाहरी वर्ग के सूचक/संदर्भ को संग्रहीत करने के लिए अपने const_iterator कक्षा को समायोजित करना होगा, और operator*() में इस पॉइंटर/संदर्भ का उपयोग करना होगा।

+0

धन्यवाद, यह स्पष्ट है। और हाँ, मेरे कोड में, m_data तक पहुंच गलत है। – enigma

2

जैसा कि सॉजेरड ने पहले ही उत्तर दिया है, आप friend कीवर्ड का उपयोग करके पहुंच प्रदान कर सकते हैं। हालांकि, यदि आप जावा-शैली के आंतरिक कक्षाओं की तलाश में हैं, तो सी ++ में ऐसी कोई चीज़ नहीं है।

8

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

यह भी ध्यान रखें कि संरक्षित डेटा आमतौर पर एक कोड गंध होता है और आमतौर पर इससे बचा जाना चाहिए। यदि उपयुक्त हो तो निजी डेटा और संरक्षित इंटरफ़ेस को प्राथमिकता दें।

संपादित करें: जब तक कि यह एक कंटेनर प्रोग्राम करने का तरीका सीखने के लिए कड़ाई से अभ्यास नहीं करता है, तो सी ++ मानक कंटेनर जैसे vector का उपयोग करें जो अच्छी तरह से विकसित, डीबग और अनुकूलित हैं।

+0

हां, जैसा कि मैंने नवाज से कहा है, यह एक अभ्यास है। संरक्षित डेटा के बारे में, ऐसा इसलिए है क्योंकि मेरे पास एक इटरेटर वर्ग है जो const_iterator से विरासत में मिलता है। – enigma

+0

@enigma क्या आप वाकई प्रतिस्थापन का प्रतिनिधित्व करते हैं? ऐसा लगता है कि आपके इटरेटर को const_iterator से विरासत में प्राप्त करने वाले दीर्घ अवधि में अल्पावधि में हल होने की तुलना में अधिक समस्याएं हो सकती हैं। –

+0

गैर-कॉन्स्टेटर इटरेटर (या यहां तक ​​कि होना चाहिए) const_iterator से प्राप्त कर सकते हैं। आम तौर पर इस तरह गैर-कॉन्स और कॉन्स इटरेटर्स की तुलना करना अधिक आसान होता है, एक गैर-कॉन्स इटरेटर को कॉन्स्ट-इटरेटर को असाइन करें, और इसी तरह। और यह एक उचित प्रतिस्थापन है: हर जगह जहां एक const_iterator का उपयोग किया जा सकता है, एक गैर-कॉन्स इटरेटर का भी उपयोग किया जा सकता है। – Sjoerd

0

हालांकि const_iteratorSListArray का एक दोस्त आपकी समस्या का समाधान करेगा, लेकिन मुझे आश्चर्य है कि आप std::vector का उपयोग क्यों नहीं करते हैं। अभी तक एक और नई जेनेरिक कक्षा क्यों?

आप एक नया नाम के लिए देख रहे हैं, तो आप typedef के रूप में कर सकते हैं:

typedef std::vector<Node<int>>     NodeList; 
typedef std::vector<Node<int>>::iterator  NodeIterator; 
typedef std::vector<Node<int>>::const_iterator NodeConstIterator; 
+0

आपका अवलोकन सही है। लेकिन मैं अभ्यास के लिए, विभिन्न रूपों में एक सिंगल लिंक्ड लिस्ट को लागू कर रहा हूं। – enigma

0

एक संदर्भ दर्रा:

class const_iterator { 
public: 
    const_iterator(ListArray<T> &arr) : arr(arr) { } 
private: 
    ListArray<T> &arr; 
}; 

और फिर आप दोस्त सामान भी जरूरत है।

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