2009-05-17 8 views
1

J'ai le code qui ressemble à ceci:Comment se référer à une "classe propriétaire" en C++?

template<class T> 
class list 
{ 
public: 
    class iterator; 
}; 

template<class T> 
class list::iterator 
{ 
public: 
    iterator(); 
protected: 
    list* lstptr; 
}; 

list<T>::iterator::iterator() 
{ 
    //??? 
} 

Je veux faire le constructeur de list::iterator pour faire le point iterator::lstptr à la liste où il est appelé. I.e .:

list xlst; 
xlst::iterator xitr; 
//xitr.lstptr = xlst 

Comment ferais-je cela?

Et aussi, suis-je référentes mon droit iterator-constructeur, ou dois-je faire quelque chose comme ceci:

template<class T> 
class list<T>::iterator 
{ 
public: 
    list<T>::iterator(); 
protected: 
    list* lstptr; 
}; 
+0

Avez-vous essayé le code que vous avez commenté dans le deuxième bloc? Je ne connais pas le C++ (seulement C) et ça ressemble à ce que je ferais. – hhafez

+0

Votre dernière version d'itérateur est correcte si vous changez le ctor de la liste :: iterator(); -> itérateur(); Bravo –

Répondre

3

Vous pouvez transmettre la liste au constructeur de iterator:

list xlst; 
list::iterator xitr(xlst); 

Ou , vous pourriez faire une fonction d'usine d'itérateur:

list xlst; 
list::iterator xitr = xlst.create_iter(); 

Dans le cas de fonction d'usine, le create_iter() fonction peut utiliser this pour faire référence à la liste d'inclusion.

+0

Ouais, j'étais sur le point de faire ça, jusqu'à ce que je me sois rendu compte que je devrais être capable de faire de l'itérateur une classe égale. Ensuite, je lisais votre réponse et me racontais que j'appellerais itérateur avec "list :: itérateur" et non "xlst :: itérateur". Mon but était de recréer certains aspects du "vecteur". –

0

Puisque vous n'avez pas besoin de changer (réinsérer) le pointeur et que vous n'avez pas besoin de la valeur NULL, j'utiliserais plutôt une référence. Vous pouvez également utiliser une liste d'initialisation lors de l'attribution de la variable membre (et si vous utilisez une référence).

template<class T> 
class list::iterator 
{ 
public: 
    iterator(list& parent) : lstptr(parent){} 

protected: 
    list& lstptr; 
}; 

Et comme mentionné précédemment: utilisez une méthode factory dans la classe list pour construire des objets de type list :: iterator.