Accueil > Forum > > > > instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur
instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur
dimanche 12 juillet 2009 à 17:38:33 |
instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

wozzeck7
|
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 ?
Merci.
|
|
dimanche 12 juillet 2009 à 19:08:37 |
Re : instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

CptPingu
|
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; };
Tu peux alors faire :
Prog.a = new A(4);
Etait-ce bien là ta question ?
|
|
dimanche 12 juillet 2009 à 19:48:23 |
Re : instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

juju12
|
tu peux aussi passer par une fonction de création personnalisée :
class A1;
// ...
class A
{
// ...
static A* new_instance(unsigned iType);
};
class A1 :public A
{
// ...
};
A* A::new_instance(unsigned iType)
{
switch(iType)
{
case 1: return new A1();
case 2: return new A2();
// ...
}
}
de même pour B, C, D...
donc tu pourras par la suite :
Prog.a=A::new_instance(4);
Prog.b=B::new_instance(6);
// ...
|
|
dimanche 12 juillet 2009 à 21:13:54 |
Re : instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

wozzeck7
|
@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.
|
|
dimanche 12 juillet 2009 à 22:48:44 |
Re : instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

CptPingu
|
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.
|
|
dimanche 12 juillet 2009 à 23:11:31 |
Re : instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

wozzeck7
|
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é ?
|
|
dimanche 12 juillet 2009 à 23:55:22 |
Re : instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

CptPingu
|
Réponse acceptée !
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).
#include <iostream> #include <map>
class Security { public: virtual void hello() const { std::cout << "Security" << std::endl; } };
template <class Derived> struct SecurityType { static Security* instanciate() { return Derived::instanciate(); } };
class Encryption : public Security, public SecurityType<Encryption> { public: virtual void hello() const { std::cout << "Encryption" << std::endl; }
static Security* instanciate() { return new Encryption; }
};
class Authentication: public Security, public SecurityType<Authentication> { public: virtual void hello() const { std::cout << "Authentication" << std::endl; }
static Security* instanciate() { return new Authentication; } };
typedef Security* (*pFuncInstanciate) ();
int main() { std::map<int, pFuncInstanciate> table; table[4] = Encryption::instanciate; table[1] = Authentication::instanciate;
int choice = 0; std::cin >> choice; Security* sec = table[choice]();
sec->hello();
delete sec; return 0; }
NB: Si on choisit un nombre différent de 1 ou 4, l'appli plante. Je ne gère pas les erreurs, c'est juste un exemple.
|
|
lundi 13 juillet 2009 à 00:03:39 |
Re : instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur

wozzeck7
|
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.
|
|
Cette discussion est classée dans : fonction, prog, utilisateur, choix, instantiation
Répondre à ce message
Sujets en rapport avec ce message
cin ? [ par dleewax ]
Bonjour !je vous explique mon cas...je suis debutant et je tente de développer un petit prog de résolution d'équation...j'aimerais que l'utilisateur p
erreur de conception? [ par frdestroyers27 ]
Salut a tous!ca serait pour savoir si je fait une erreur de conception!j'ai un fichier main.cpp avec la fonction WinMain dedans qui contient juste un
Exécuter une fonction en arrière plan [ par sena ]
Bonjour,j'ai créer une dll dans la quelle ce trouve une fonction d'écoute en UDP qui affiche un message dè kel recoit kelke choz.Cette fonction tourne
Récupération de l'environnement [ prog VC++ ] [ par thomychat ]
Bonjour,Je cherche à récupérer en C++ (dans un prog graphique) les arguments de l'utilisateur avant le lancement de mon prog.Je m'explique : en C, un
texte [ par 95175364 ]
En utilisant le Visual C++, j'aimerais réaliser une fonction qui me permet de saisir un texte a partir du clavier, le texte peut être écrit selon un s
thread et plein ecran [ par dletozeun ]
bonjour,je voudrais savoir s'il est possible qu'un thread créé par un prog (en c++) qui se lance en plein ecran, puisse ne jamais s'excuter...c appare
appel d'une fonction [ par dletozeun ]
bonjour,Je voudrais savoir s'il est possible d'appeler une fonction dont ont ne connais pas le nom dans le prog lui meme, mais en le recuperant dans u
Utilisateur actif sur le prog [ par Xilofeon ]
BonsoirVoila je cherche un code me permettant de savoir si l'utilisateur est actif sur le programme ou inactif au bou de 10 min par exemple. Euh pour
Fonction qui recupere le HWND du prog courrant...??? [ par youpiyoyo ]
j'aurai besoin de recupere le HWND,je sais ke l'on peut le mettre en global du genreLRESULT CALLBACK DlgMainProc(HWND hwnd, UINT msg, WPARAM wParam, L
fonction de controle [ par imad_lol ]
svp je veut savoir comment créé une fonction qui fait le controle des caracterer entrer par l'utilisateur.je dois utilisé cette fonction dans differen
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|