begin process at 2012 05 29 04:05:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

instantiation de telle ou telle classe en fonction d'un choix de l'utilisateur


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales