Héritage de "templates recursive".

Héritage de "templates recursive". - C++ - Programmation

Marsh Posté le 04-07-2008 à 14:38:53    

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
Reply

Marsh Posté le 04-07-2008 à 14:38:53   

Reply

Marsh Posté le 04-07-2008 à 14:56:15    

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'é.

Reply

Marsh Posté le 04-07-2008 à 15:00:11    

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
Reply

Marsh Posté le 04-07-2008 à 16:38:30    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed