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

  FORUM HardWare.fr
  Programmation
  C++

  Héritage de "templates recursive".

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Héritage de "templates recursive".

n°1755613
thoduv
Posté le 04-07-2008 à 14:38:53  profilanswer
 

Bonjour,
 
J'ai crée une classe "Referencable", qui est une classe template, et dont je voudrai faire hériter tous mes objets qui peuvent être "référencés": c'est à dire dont on garde une liste (id, objet), qui permet d'éviter la création d'objets "en double" (c'est pour gérer des textures dans un petit moteur de jeu).
 
Voici  la classe (implémentée dans l'header, pour une autre raison):

Code :
  1. template<typename T> class Referencable
  2. {
  3. public:
  4.  static T *ref(const char *c_id)
  5.  {
  6.   static std::map<std::string, T*> _collection; // hack pour cause de compilateur chiant
  7.   std::string id(c_id);
  8.   if(_collection.count(id) != 0)
  9.   {
  10.    _collection[id]->_refCount++;
  11.   }
  12.   else
  13.   {
  14.    _collection[id] = new T;
  15.   }
  16.   return _collection[id];
  17.  }
  18.  void unref()
  19.  {
  20.   _refCount--;
  21.   if(_refCount <= 0)
  22.    delete this;
  23.  }
  24. protected:
  25.  Referencable() : _refCount(1) {}
  26.  int _refCount;
  27. };


 
Ensuite, je n'ai plus qu'à faire hériter ma classe Texture de Referencable<Texture>, à déclarer Referencable<Texture> comme "friend", et ça roule, je peut instancier mes textures avec Texture::ref("id" );
 
Maintenant, j'ai besoin de créer une nouvelle classe, disons TextureSpeciale, qui dérivera elle-même de Texture... et c'est là que ca marche plus !
 
J'ai bien essayé de faire re-dériver TextureSpeciale de Referencable<TextureSpeciale>, mais je me mange des "error: reference to 'ref' is ambiguous" à la compilation.
 
Quelqu'un peut m'éclairer, ou me proposer une autre solution viable ?
Merci d'avance !
Thoduv


Message édité par thoduv le 04-07-2008 à 14:40:32
mood
Publicité
Posté le 04-07-2008 à 14:38:53  profilanswer
 

n°1755620
Taz
bisounours-codeur
Posté le 04-07-2008 à 14:56:15  profilanswer
 

Referencable<TextureSpeciale>::ref(machin);
 
 
sinon ça sent pas bon truc avec le delete this qui n'est pas symétrique à ton ref: tu delete pas ce que tu as new'é.

n°1755623
thoduv
Posté le 04-07-2008 à 15:00:11  profilanswer
 

Ah ouais, mais du coup, c'est moche et pas clair à écrire... Enfin bref, je vais soit m'en contenter, soit utiliser deux trois macros. ^^
 
Et pour l'autre problème, tu veux dire qu'il faut que je fasse "delete (T*)this;" (même si c'est du cast tout pas beau) ?
 
Edit: Maintenant, ca me fait pareil pour le _refCount (membre public de Referencable), qui serait ambigu...


Message édité par thoduv le 04-07-2008 à 15:02:33
n°1755656
Taz
bisounours-codeur
Posté le 04-07-2008 à 16:38:30  profilanswer
 

Je veux pas quoi que ce soit. Seulement tu allous un T et après tu Referencable<T>. Niveau CRTP ça coince, ça n'appelle pas le destructeur des classes filles.


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

  Héritage de "templates recursive".

 

Sujets relatifs
redirection recursive avec paramêtreFonction récursive et méthodologie sur fonctionnement
Valeur par defaut et heritage + methode virtuelleVisibilité d'une méthode après un héritage
Héritage dans les collectionsRecastage et héritage avec une List
Heritage: virtual / static probleme de designquestion sur l'héritage multiple
héritage multiple .. pour ou contre ?[Javascript] héritage entre classe dans des fichiers différents
Plus de sujets relatifs à : Héritage de "templates recursive".


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)