2011-04-20 201 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; 

    // ... 
}; 

此代碼給我一個編譯器錯誤,所以,我想知道是否是可能的爲內部階層提供外部階層成員的接觸。

謝謝。

+0

可能重複[可以內部類訪問私有變量?](http://stackoverflow.com/questions/486099/can-inner-classes-access-private-variables) – 2016-10-31 23:18:15

回答

2

是的,使用朋友聲明。

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

更新:哦,對m_data您的訪問是錯誤的。如果沒有指向外部類的實例的指針,內部類無法訪問外部類的成員。所以你必須調整const_iterator類來存儲外部類的指針/引用,並在operator*()中使用該指針/引用。

+0

謝謝,很明顯。是的,在我的代碼中,對m_data的訪問是錯誤的。 – enigma 2011-04-20 15:04:50

2

正如Sjoerd已經回答的那樣,您可以使用friend關鍵字授予訪問權限。但是,如果您正在尋找Java風格的內部類,那麼在C++中就沒有這種東西。

8

嵌套類已經可以訪問包含類的成員,假設他們有一個指針/引用包含類來操作。您的迭代器需要存儲對外部類的引用,以便能夠按照您的需要訪問容器。

另請注意,受保護的數據通常是一種代碼味道,通常應避免。如果適用,優先選擇私人數據和受保護的界面。

編輯:除非這是嚴格的學習如何編程容器的練習,否則只需使用C++標準容器之一,如vector,這些容器都經過良好開發,調試和優化。

+0

是的,就像我對納瓦茲說的那樣,這是一個練習。關於受保護的數據,這是因爲我有一個繼承自const_iterator的迭代器類。 – enigma 2011-04-20 15:12:10

+0

@enigma你確定這種關係代表了替代嗎?看來從長期來看,從const_iterator繼承你的迭代器可能會導致比它在短期內解決更多的問題。 – 2011-04-20 15:24:12

+0

非const迭代器可以(甚至應該)從const_iterator派生。通常用這種方式比較非const和常量迭代器,將常量迭代器賦值給const迭代器容易得多,依此類推。這是一個合適的替代:在任何可以使用const_iterator的地方,也可以使用非const迭代器。 – Sjoerd 2011-04-21 21:33:37

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 2011-04-20 15:10:01

0

傳遞一個參考:

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

然後你需要朋友的東西太多。