2009-10-27 6 views
1

Je suis à nouveau coincé avec des modèles. Disons, je veux mettre en œuvre un système guicell. chaque guicell peut contenir un certain nombre de guicellules. jusqu'à présent, donc la structure de l'arbre. en std-C++ j'irais pour sthg. comme:Récurrence de modèle C++ - comment résoudre?

template <typename T> 
class tree 
{ 
public: 

    void add (T *o)  { _m_children.push_back (o); } 
    void remove (T *o) { ... }; 

    list<T*> _m_children; 
}; 

class _cell : public tree<_cell> 
{ 
public: 
    _cell()   { x = 0; y =0; } 
    long    x,y; 
}; 

Mais maintenant je veux aller plus loin, et rendre les cellules référencables si le codeur le souhaite. donc j'implémente fondamentalement une refTree - classe à cette fin qui prend aussi juste des pointeurs (_cell *) en entrée.

template <typename T> 
class refTree 
{ 
public: 
    void add (T *o)  { _ref<T> r = o; _m_children.push_back (r); } 
    void remove (T *o)  { ... } 

    list<_ref<T> > _m_children; 
}; 

Aussi, cela fonctionne encore très bien. en utilisant

class _cell : public refTree<_cell> 
{ 
    : 
}; 

aucun changement à l'utilisateur de code, mais tout ajouté _cell * sont maintenant référencées avant de les ajouter à l'arbre. Bon, mais maintenant je veux pouvoir choisir sur _cell - level quelle implémentation arborescente utiliser. Cela signifie donc que je dois faire de la _cell - class une classe de template qui prend une classe de template en paramètre (le template d 'arbre choisi).

template <template <typename> class __TyTree = tree> 
class Cell : public __TyTree <Cell>  // cannot work - no question, Cell expects input 
{ 
}; 

Et ici nous avons eu le problème récurrent - ofcourse le compilateur ne peut pas résoudre, parce que la cellule est en attente d'un arbre -. Paramètre qui attend un paramètre de type simple (qui devrait être un COF cellulaire est en attente un arbre - paramètre qui attend un simple ....).

Vous obtenez l'image - quelle est une bonne solution à ce genre de problème?

Répondre

5

Il n'y a pas de récursivité. L'argument du modèle pour Cell est __TyTree, et non __TyTree<Cell>.

template <template <typename> class __TyTree = tree> 
class Cell : public __TyTree <Cell<__TyTree> > 
{ 
}; 

int main() 
{ 
    Cell   mycell0; // error 
    Cell<>  mycell1; // ok. tree is used 
    Cell<tree> mycell2; 
    Cell<refTree> mycell3; 
} 

P.S. Vous ne devez pas utiliser deux traits de soulignement principaux dans __TyTree car il est réservé à des fins d'implémentation par C++ Standard.

+0

Vérifiez s'il vous plaît. Je pense que tout va bien. –

+0

Aaah oui, vous avez raison, il se compile bien maintenant. Et merci pour l'intuition avec les doubles soulignements - permettra d'éviter cela. Une chose m'intrigue encore - le paramètre par défaut - n'est pas accepté ici - il semble que je doive déclarer cellule mycell; Je ne peux pas déclarer Cell mycell; - des idées ? –

+1

Vous devriez écrire 'Cell <>' si vous voulez omettre le paramètre par défaut. Parce que 'Cell' est la classe modèle. –

2

Vous avez deux problèmes distincts: le contenu d'une cellule et la manière dont les cellules sont connectées entre elles. Vous devez utiliser deux structures de données distinctes pour cela. En d'autres termes, le bon lien à rompre est l'héritage de la cellule de l'arbre. La petite quantité de mémoire que vous enregistrez ne vaut pas la peine - abandonnez l'approche "intrusive". La cellule ne doit pas être consciente de la façon dont l'arbre le tient.

+0

hmmm, plus je pense à ce sujet le plus je l'aime. Mais a besoin de beaucoup de repenser. –

+0

Merci pour votre aide, après avoir passé plusieurs heures dans les cercles essayant d'évaluer les différentes approches, je pense que j'ai finalement trouvé une solution - un système de nœud.Ainsi chaque nœud peut être connecté à d'autres nœuds et expose getNext, getPrev, getFirstChild, getParent, ... Et la cellule dérive du nœud pour avoir un accès direct à ses enfants et aussi à ses parents - Cela signifie aussi que je n'ai pas à implémenter des templates pour ce qui est toujours une bonne chose, je suppose. –

Questions connexes