Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1595 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Problème de declaration de sous-class

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de declaration de sous-class

n°867738
peak
Posté le 08-10-2004 à 03:50:38  profilanswer
 

Bonjour à tous,
j’ai un problème dont je ne trouve pas de solution ;
 
Prenons un exemple :

Code :
  1. template <class TypeA, class TypeB, class TypeC>
  2. class Stock : public Index<TypeA, Item<Elem<TypeA, TypeB> > >{
  3. template<class Type>
  4. class Item {
  5.  public:
  6.  friend class Stock<TypeA, TypeB, TypeC>;
  7.  Type E;
  8.  Item<Elem<TypeA, TypeB> > * down;
  9.  Item<Elem<TypeA, TypeB> > * up;
  10.  Item(Type &T, Item<Elem<TypeA, TypeB> > * _down=NULL, Item<Elem<TypeA, TypeB> > * _up=NULL): E(T), down(_down), up(_up) { }
  11.  Item(): E(), down(NULL), up(NULL) {}
  12.  Type& Info(){ return E; }
  13.  };
  14. bool var_membre ;
  15. public :
  16. bool fctMembre() ;
  17. } ;


 
Ceci ne compile évidement pas ; au moment de la déclaration de la class Stock, la class Item n’a pas encore été définie or celle-ci est utilisée pour etre passé en argument de template à la class (index) dont herite Stock.
( => « 'Item' : undeclared identifier »)
 
donc je déclare Item comme-ce ci en début de code :  
 

Code :
  1. template <class TypeA, class TypeB, class TypeC>
  2. class Stock;
  3. template < class TypeA, class TypeB, class TypeC, class Type>
  4. class Stock<TypeA, TypeB, TypeC>::Item<Type>;


 
Mais mon compilo m’envoit :
=>” 'Item' : is not a member of 'Stock<TypeA, TypeB, TypeC>'”
 
Et là je comprend pas ; peut être ai-je mal déclaré les classes mais me semble avoir un peu tout tester pour être sur que ce n’était pas une faute de syntaxe (le « template < class TypeA, class TypeB, class TypeC, class Type> » est un peu bizarre mais je sais pas comment faire autrement ? ) .
 
Donc voilà si quelqu’un à une super solution à me proposer, ça m’arrangerai bien.
J’espère avoir été claire.
Merci d’avance.
 :bounce:

mood
Publicité
Posté le 08-10-2004 à 03:50:38  profilanswer
 

n°867752
Taz
bisounours-codeur
Posté le 08-10-2004 à 08:38:35  profilanswer
 

je comprends pas trop ce que tu veux faire mais tu te mords la queue : tu veux faire une classe qui hérite d'une de ses classes imbriquées ...
 
Moi je te conseille tout simplement de définir Item dans namespace anonyme. Et d'utiliser des typedef pour la lisibilité.

n°867762
Lam's
Profil: bas.
Posté le 08-10-2004 à 09:17:47  profilanswer
 

Pareil : pour cacher du code, ici les namespaces sont carrément plus adaptés que les classes imbriquées.  
 
Ceci-dit, c'est un vrai merdier ton truc. A ce niveau là, je commencerai à introduire des classes d'interfaces (toutes fonctions virtuelle pures quoi), ne serait-ce que pour simplifier le biniou.  
 
En n'utilisant que des pointeurs sur Item, et en faisant dériver Item d'une classe "abstraite", tu devrais pouvoir te dépatouiller, je pense, quitte à rendre Item dépendant de sa classe Elem.
 
 

Code :
  1. typedef ItemInterface<TypeA, TypeB> ItemAB;
  2. template <IteamAB, class TypeC>
  3. class Stock : public Index<IteamAB::TypeA, ItemAB >{ 
  4.     template<class Type>
  5.      class Item : ItemAB {


n°867763
Taz
bisounours-codeur
Posté le 08-10-2004 à 09:19:07  profilanswer
 

ah non, commence pas à saucer les zolis template avec du virtuel :o

n°867776
Lam's
Profil: bas.
Posté le 08-10-2004 à 09:35:28  profilanswer
 

Taz a écrit :

ah non, commence pas à saucer les zolis template avec du virtuel :o


Si c'est cool. Il parrait que c'est la dernière mode à miami. En plus, ils utilisent des boost::lambdas pour faire hype comme les programmeurs python de L.A.

n°867917
peak
Posté le 08-10-2004 à 12:18:56  profilanswer
 

Merci pour vos conseils !
J’avoue que c’est un peu bordelique mais c’est le seule endroit du code  :ange:  
En fait le but est d’indexer les items d’une b-queue doublement liée avec un AVL, ce qui marchait très bien jusqu'à ce que j’ajoute une classe Index entre ma b-queue (Stock) et mon AVL dont herite maintenant Index, le but étant de pouvoir éventuellement rendre index statique pour avoir un indexer unique pour un ensemble de b-queue.
 
En fait j’avais déjà tenter de définir Item dans namespace anonyme mais comme j’utilise

Code :
  1. friend class Stock<TypeA, TypeB, TypeC>;

ou encore

Code :
  1. Item<Elem<TypeA, TypeB> >

il faut donc que je redéfinisse le template d’item :  

Code :
  1. template < class TypeA, class TypeB, class TypeC, class Type>


Et donc corrige toutes les instanciations d’Item, ce que je voulais justement éviter par ce que y’en a un paquet, que ça rendra le code encore moins lisible et que conceptuellement cette définition d’item appartient à la stock (j’ai d’autres définitions d’Item dans d’autres namespaces pour le même prog) mais bon si c la seule solution….je me résignerai.  :(


Message édité par peak le 08-10-2004 à 12:20:11

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Problème de declaration de sous-class

 

Sujets relatifs
[HTML/CSS] Problème taille police dans tableau sous IE [RESOLU][Oracle] Problème de performances Instr et CLOB
[PHP]probleme liste deroulante sous IEProbleme avec la fonction val()
[VB] problème listboxProbleme avec mes evenements
probleme avec la longueur de la page de mon site??Aux amateur de difficultés - Problème de hauteur de cellules
Probleme entre les map area et du phpProblème d'enregistrement ACCESS via site Web
Plus de sujets relatifs à : Problème de declaration de sous-class


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR