Accès de la classe interne aux membres de la classe externe

Je suis très confus sur ce sujet, en gros, j’ai ce code:

template  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> m_data; // ... }; 

Ce code me donne une erreur de compilation, je voudrais donc savoir s’il est possible de donner à la classe intérieure l’access aux membres de la classe extérieure.

Merci.

Les classes nestedes ont déjà access aux membres de la classe contenante, en supposant qu’elles aient un pointeur / une référence vers la classe contenante sur laquelle opérer . Votre iterator devra stocker une référence à la classe externe pour pouvoir accéder au conteneur à votre guise.

Notez également que les données protégées dégagent généralement une odeur de code et doivent généralement être évitées. Préférez les données privées et une interface protégée, le cas échéant.

EDIT: Sauf s’il s’agit ssortingctement d’un exercice visant à apprendre à programmer un conteneur, il suffit d’utiliser l’un des conteneurs standard C ++, tel que vector qui sont bien développés, débogués et optimisés.

Comme Sjoerd a déjà répondu, vous pouvez donner l’access en utilisant le mot-clé friend . Cependant, si vous recherchez des classes internes de style Java, cela n’existe pas en C ++.

Oui, utilisez une déclaration d’ami.

 private: std::vector > m_data; friend class const_iterator; 

Mise à jour : Oh, et votre access à m_data est incorrect. La classe interne ne peut pas accéder aux membres de la classe externe sans un pointeur sur une instance de la classe externe. Vous devez donc ajuster votre classe const_iterator pour stocker un pointeur / une référence vers la classe externe et utiliser ce pointeur / cette référence dans l’ operator*() .

const_iterator un ami de SListArray résoudrait votre problème, mais je me demande pourquoi n’utilisez pas std::vector . Pourquoi encore une nouvelle classe générique?

Si vous cherchez un nouveau nom, vous pouvez typedef comme typedef :

 typedef std::vector> NodeList; typedef std::vector>::iterator NodeIterator; typedef std::vector>::const_iterator NodeConstIterator; 

Passer une référence:

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

Et puis vous avez besoin des trucs d’amis aussi.