polymorphisme et template - C++ - Programmation
Marsh Posté le 30-12-2002 à 15:57:21
Bon apparemment ca vient de Visual 6.0
Sous GCC ca amrche ...
Bizarre !!
Marsh Posté le 30-12-2002 à 18:01:39
Joel F a écrit : Bon apparemment ca vient de Visual 6.0 |
C'est bizarre, je vois pas de problème... Quand tu utilises de debugger de Visual C++ en pas à pas pour le dynamic_cast, que vois-tu ?
Quel service pack de Visual as-tu ?
Au fait, y a des techniques plus efficaces pour gérer des pools, surtout quand les objets contenus sont petits...
Par exemple en se débrouillant pour que chaque objet du pool soit:
- un objet du pool (T)
- un noeud de liste chainee
Après tu alloues tes éléments par paquets (genre new T[128])
Mais bon plein de gens ont déja fait des libs de pool d'objets de taille fixe, tu devrais jeter un coup d'oeil sur google
Marsh Posté le 30-12-2002 à 18:10:16
VC6 est loin d'être au top pour le support des templates.
Marsh Posté le 30-12-2002 à 21:32:00
merci a tous de tte maniere, je v jeter VC6 pr wxWindows+gcc.
En tout cas, mon Pool est bien pour ce que je fais donc bon ...
J'aime bien faire les choses par moi-meme
Marsh Posté le 31-12-2002 à 08:42:51
Joel F a écrit : merci a tous de tte maniere, je v jeter VC6 pr wxWindows+gcc. |
question bête quand même: sous visual, le support RTTI n'est pas activé par défaut. Tu l'as activé avant de compiler? Sinon, c'est normal que ca crash.
Ceci dit, je ne te retiens pas pour jeter VC6!
Marsh Posté le 31-12-2002 à 08:54:41
le pb de vc6 c'est qu'il est indispensable lorsque l'on utilise une dll tierce, non ? (je pense aux histoires de mangling C++)
Marsh Posté le 31-12-2002 à 10:32:36
bon a part ca mon Memory Manager rencontre un e probleme
j'utilise une class Handle<T> pour etre un descripteur des objets allouées dand les Pool<T>. Une class MemoryManager gere des groupes de Pool<T> via une map<id,IPool*>.
en clair, l'utilisateur pond un truc du style
Code :
|
Comment gerer l'heritage via le systeme de Pool ???
Dois je autorise des affectations du style :
template<T2>
Handle<T> operator=(const Handle<T2>& src);
et verifier si il existe une conversion explixite de T2 vers T ??
Marsh Posté le 31-12-2002 à 12:01:29
Lolo- a écrit : le pb de vc6 c'est qu'il est indispensable lorsque l'on utilise une dll tierce, non ? (je pense aux histoires de mangling C++) |
Ben disons plutot qu'il est indispensable quand on utilise une dll tierce crée avec Viual C++. Ca doit etre la meme chose chez Borland...
Marsh Posté le 01-01-2003 à 00:02:11
kenshiro182 a écrit : |
c'est bizarre perso je vois plein de problemes potentiels
deja IPool n'est pas une interface consistante avec Pool<T>
acquire ne peux pas etre differenciee sur le type de retour (c'est une base de la surcharge en C++) donc au mieux, acquire() dans IPool ne sert a rien au pire c'est un bug ou alors il n'a pas poste son bon code. D'autant plus qu'il appelle acquire de IPool qui n'est pas initialise (classe abstraite) dans son exemple.
Ensuite la syntaxe du dynamic cast
c'est avec les ()
exemple:
dynamic_cast<toto*>(tutu);
Ensuite les exceptions qu'il jette sont des sous-classes de la classe template.
Difficile de les intercepter dans ce cas sans savoir quel type de pool a balance l'exception (a moins de les faire deriver d'une classe d'exception plus globale).
Bon supposons qu'il n'y ait pas tous ces problemes :
acquire appele sur un pool initialise avec le constructeur par defaut jettera MemoryFull, puisque FreeMemory n'a pas ete touche depuis sa construction..
Bref il faudrait avoir le vrai code pour juger a mon avis..
LeGreg
Marsh Posté le 01-01-2003 à 14:28:10
legreg a écrit : |
Ouh la la j'ai pas les yeux en face des trous. Ou alors j'ai regardé trop vite. Honte sur moi !
Marsh Posté le 01-01-2003 à 19:46:34
euh desole, j'ai oublie de corriger (j'etais ds le colatre) mais :
Code :
|
et
Code :
|
et je confirme que sous Gcc ca compile propre en -Wall -ANSI -pedantic et que surtout ca s'execute correctement.
La classe interne d'exception dans un template ca ne pose PAS de probleme :
Code :
|
Marsh Posté le 01-01-2003 à 20:55:17
pourquoi tu ne mets pas tout ton code plutot que des bouts ?
Ta methode initialize n'est pas complete.
acquire de IPool et de Pool ont des sens differents
et je ne suis pas trop sur que tu aies resolu l'ambiguite..
Et tu n'as pas corrige la syntaxe du "dynamic_cast<toto*>(bidule);" meme si gcc te laisse compiler c'est une erreur de sa part. En tout cas je ne suis pas sur que visual te laisse faire.
Code :
|
me semble plus correct.
Pour la classe interne d'exception ca ne pose effectivement pas de probleme si c'est comme ca que tu l'utilises. Ceci dit, question de gouts..
LeGreg
Marsh Posté le 01-01-2003 à 23:54:11
desole de poster des fragments de code, le pb c'est qu'il y a pas mal de parties de ce trucs qui sont sensées restaient confidentielles ou qui sont trop volumineuses donc bon ...
N'empeche, effectivement, la correction du dynamic_cast etait necessaire mais l'ambiguite est bien levée.
gcc compile, Visual aussi masi visual fait n'importequ'oi apres donc... Bref, merci encore.
Promis le prochain bout de code que je poste il est propre et complet
Marsh Posté le 30-12-2002 à 15:34:00
bon on va peut etre y arrive cette fois :
Je dois gérer un gestionnaire de memoire un peu complexe.
Pour commencer, j'ai besoin d'une classe Pool, template, qui permet de gérer des tableaux statiques de types T :
bon le truc ce que je veux pouvoir gérer des Pool<int>, Pool<char>, Poll<Classe> etc ...
Donc dans mon gestionnaire de memoire je vais mettre un truc du style :
Mais est ce bon ?
Je penseez rajouter une interface du style :
et faire heriter Pool<T> de IPool.
Manque de bol, ca chie, impossible d'appeler le bon Pool a partir d'un IPool*
Pliz help