wozzeck7
Messages postés4Date d'inscriptiondimanche 12 juillet 2009StatutMembreDernière intervention13 juillet 2009
-
12 juil. 2009 à 17:38
wozzeck7
Messages postés4Date d'inscriptiondimanche 12 juillet 2009StatutMembreDernière intervention13 juillet 2009
-
13 juil. 2009 à 00:03
Bonjour,
j'aurais besoin d'aide ou de conseils. Voici ma question:
Mon programme doit former quelque chose de façon modulaire, composé de 6 blocs. Pour chacun des blocs, il y a plusieurs possibilités (plusieurs classes héritées).
class Prog {
public:
A *a;
B *b;
C *c;
D *d;
E *e;
F *f;
};
Je voudrais que les classes soient instantiées en fonction du choix de l'utilisateur.
Par exemple, l'utilisateur me donne en entrée {4,2,1,8,3,5}. Donc:
Prog.A = new A4;
Prog.B = new B2;
Prog.C = new C1;
Prog.D = new D8;
Prog.E = new E3;
Prog.F = new F5;
Je ne peux pas faire de switch du style:
Switch(input)
case 1: Prog.A = new A1;
case 2: Prog.A = new A2;
Je peux avoir des centaines de possibilités, c'est donc inenvisageable.
Je veux avoir une sorte de table de correspondance mais je ne sais pas comment l'implémenter.
J'espère être clair, je tenterais de préciser si ce n'est pas le cas.
Quelqu'un aurait-il une piste ou une solution à mon problème ?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 12 juil. 2009 à 23:55
Je peux te proposer une solution, pour émuler cela. Vu qu'en C++, on peut pas mettre un type (en Java c'est une classe qui s'appelle Class<?>), on va émuler cela avec des méthodes statiques.
Pour obliger l'utilisateur à créer des classes qui contiennent une méthode statique "instance()", on va créer une classe templaté qui va s'en assurer (et au passage permettre d'émuler un héritage de méthode statiques, cf curiously recurring template pattern).
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 12 juil. 2009 à 19:08
J'ai du mal à saisir la finalité de la chose, mais cela ressemble à des classes identiques dont l'un des attributs aurait changé.
Je ne sais pas si cela répond à ta question, mais voici une solution:
class A
{
public:
A(int id)
: _id(id)
{
}
int getId() const
{
return _id;
}
private:
const int _id;
};
wozzeck7
Messages postés4Date d'inscriptiondimanche 12 juillet 2009StatutMembreDernière intervention13 juillet 2009 12 juil. 2009 à 21:13
@CptPingu: Non, ce n'est pas ce que je veux faire.
@juju12: Je ne veux pas de switch ; c'est acceptable pour quelques cas mais j'en aurais des centaines!
Je vais donner un exemple plus clair et plus précis:
class Security {
// code
};
class Encryption: public Security {
// code
};
class Authentication: public Security {
// code
};
class Transmission {
// code
};
class Connected: public Transmission {
// code
};
class ConnectionLess: public Transmission {
// code
};
///
class Prog {
Security *sec;
Transmission *trans;
...
};
int main() {
// demande à l'utilisateur de choisir le type de sécurité et de transmission
sec = new ???
trans = new ???
}
L'utilisateur verra sur son terminal:
Quel type de sécurité: 1- Encryption 2- Authentication
Quel type de transmission: 1- Connected 2- ConnectionLess
Je voudrais instancier les classes que l'utilisateur aura choisies.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 12 juil. 2009 à 22:48
La solution donné par juju12 (voir design pattern factory) me semble dans ce cas, la seule adaptée.
Dès le moment ou l'utilisateur fait un choix, il faut bien l'analyser, et donc il y aura des tests conditionnels.
wozzeck7
Messages postés4Date d'inscriptiondimanche 12 juillet 2009StatutMembreDernière intervention13 juillet 2009 12 juil. 2009 à 23:11
Je pensais à une solution comme une std::map avec pour chaque entrée, un entier en guise de clé et pour la valeur correspondant à la clé "quelque chose". Mais quoi? En Java, j'aurais pu mettre le nom de la classe car on peut créer une instance d'une classe à partir de son nom. Je n'ai pas dit ça plus tôt pour ne pas influencer les réponses. Il me faudrait une sorte de pointeur sur classe...
Il doit bien y avoir une façon de référencer une classe. Ainsi, avec une map, il suffit de chercher le choix de l'utilisateur - mymap.find(choice) - soit une ou deux lignes de code, au lieu de 100 lignes pour un switch avec 100 possibilités. En plus, si quelqu'un veut ajouter une possibilité, il n'aura pas besoin de toucher au code si je lui fournis une fonction permettant d'ajouter une entrée dans la map...
Je ne sais pas s'il est possible de s'en sortir avec une map STL ? ou avec une autre conteneur ? ou un conteneur personnalisé ?
wozzeck7
Messages postés4Date d'inscriptiondimanche 12 juillet 2009StatutMembreDernière intervention13 juillet 2009 13 juil. 2009 à 00:03
Parfait, c'est ce qu'il me fallait.
Je ne connais que très peu les templates, je vais étudier ça de plus près...
Merci beaucoup pour ton aide CptPingu.