vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
25 août 2005 à 15:58
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009
-
26 août 2005 à 18:56
Bonjour
J'ai la hiérarchie de classes suivante: A0, A1, A2, A3, A4... sont des sous-classes de A.
J'ai besoin d'instancier une de ces sous-classes selon la valeur d'une variable n. Pour le moment j'ai un code qui ressemble à ca:
A* p;
switch(n)
{
case 0:
p = new A1();
break;
case 1:
p = new A1();
break;
...
}
J'aimerais une solution plus jolie que ca, d'autant qu'il y a en réalité environ 15 sous classes.
J'ai pensé à un tableau de A* contenant un spécimen de chaque sous-classe, et utiliser une méthode virtual A* A::make(...)=0 pour créer un objet (les constructeurs actuels des sous-classes prennent les mêmes paramètres).
Cette solution vous semble-t-elle plus efficace, ou en avez vous une autre?
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 25 août 2005 à 16:23
salut;
t'auras du mal a faire plus joli, avec ton tableau, t'es aussi obligé
de construire un spécimen de tes 15 sous classes, donc en plus
t'auras deux créations a la place d'une. Ca ne ferait que déplacer le
code que tu trouves pas beau ailleurs ...
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 25 août 2005 à 16:29
n est déterminé à l'éxxécution, et sa valeur change pendant l'exécution. Le truc c'est que le code que j'ai mis est exécuté souvent, ce qui fait que la création des 15 spécimen ne me pose pas problème, et ce code la ne sera exécuté qu'une seule fois. Après j'utilise tranquillement mon tableau.
Comment faire avec des templates?
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 25 août 2005 à 16:48
si tu connais n qu'a l'execution, tu dois te servir de fonctions virtuelles.
je disais ca parce que parfois la virtualité est utilisée excessivement
alors que le type est connu a la compilation; mais que cela permet
d'etre plus 'general'
par ex:
class A {
virtual void func();
}
class B : public A
{
func() { autre chose }
}
peut parfois etre remplacé par qqc du genre:
class B {};
class A{
template <class T>
T* func() { return 0 };
// specialistation pour B
template <>
B* func() { return (B*)1; }
};
enfin bref
Vous n’avez pas trouvé la réponse que vous recherchez ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 25 août 2005 à 19:22
J'ai mis un temps à comprendre la! Ca n'a rien a voir, mais pourquoi tu mets struct, et pas class?
La struct init_type a juste pour objet de mettre la fonction dans le tableau c'est ca? (j'ai pas l'habitude de créer des types ad hoc comme ca)
C'est une solution que tu viens d'inventer, ou bien tu l'a déja utilisée?
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 25 août 2005 à 19:32
Oui je viens d'inventer, donc c'est certainement pas optimale. Ne
cherche pas à comprendre quelque chose dans mon utilisation de
struct/class, au debut j'avais mis class, puis struct... enfin ca
revient au meme.
L'astuce avec la struct init c'est de faire ce genre de pres-traitement, ici l'initialisation du tableau.
Et si jamais tu te demandes pourquoi
A1::init_type A1::init(id, construct);
fonctionne alors qu'on aurait du logiquement ecrire
A1::init_type A1::init(A1::id, A1::construct);
c'est à cause du "koening-lookup" sur la portée des noms (koening c'est un mec connue du commité c++).
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 septembre 2009 26 août 2005 à 08:48
Dans ton cas, remplaced la map par le vector (je suis allé un peu vite). Dans l'exemple de BS, la décision était basé sur un string et non sur un entier.....