IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Renvoyer une instance de n'importe quelle classe


Sujet :

C++

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut Renvoyer une instance de n'importe quelle classe
    Bonsoir,

    J'ai un petit soucis de "conception", ou de code. J'explique rapidement le problème. Je dispose de plusieurs gestionnaires, tous encapsulés dans plusieurs namespaces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    namespace A
    {
        namespace A1
        {
           class Gestionnaire
           {
           };
        };
     
       namespace A2
        {
           class Gestionnaire
           {
           };
        };
     
        namespace A3
        {
           class Gestionnaire
           {
           };
        };
     
        ...
    };
    Les noms des classe ont le même nom car une fonction similaire.

    Je dispose ensuite d'une classe qui possède une instance vers chacune de ces classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Generale
    {
       private:
    A::A1::Gestionnaire gest1;
    A::A2::Gestionnaire gest2;
    A::A3::Gestionnaire gest3;
    ...
    };
    Ainsi qu'un enum contenant les différents types. Ce que je voudrais faire, c'est plutôt que d'avoir plusieurs fonctions, avoir une seule fonction qui me renverait une référence de l'objet approprié suivant la valeur de la constante passée, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const Gestionnaire & getGestionnaire (monEnum enum) const
    {
       switch (enum)
       {
          case '1':
              return gest1;
           ...
       };
    }
    Ca marche bien si je n'en mets qu'un seul, et que je spécifie explicitement par exemple const A::A1::Gestionnaire & getGestionnaire (monEnum enum) const, mais j'aimerais utiliser cette méthode sans avoir créer plein de petites fonctions comme ça. J'ai essayé du côté de boost::any en faisant quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const boost::any & getGestionnaire (monEnum enum const)
    {
      ...
      return boost::any_cast<A::A1::Gestionnaire> (gest1);
       ...
    }
    Mais ça ne fonctionne pas :/. Si quelqu'un a une idée je suis preneur

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Le seul moyen que je voit est de faire dériver tous tes gestionnaires depuis une super-classe gestionnaire présente dans A pour au final, profiter du polymorphisme dans ta fonction getGestionnaire.

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Ouep, j'avais pensé à ça, mais le truc c'est que j'aurais voulu garder les namespace sous-jacents aussi indépendants que possible, et là ça m'obligerait à faire une classe gestionnaire en dehors de toute... Quoique je pourrais peut-être faire une classe Gestionnaire toute vide...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pourquoi utiliser un paramètre connu à l'exécution (monEnum) pour récupérer quelque chose que tu devras de toute façon connaître à la compilation (le type de retour de la fonction) ?

    Soit tu veux manipuler tes gestionnaires de manière abstraite et il faut utiliser une classe de base, soit tu n'as jamais besoin d'abstraction et tu peux simplement faire un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T> T& GetGestionnaire();
     
    template <> A1::Gestionnaire& GetGestionnaire<A1::Gestionnaire>() {return gest1;}
    template <> A2::Gestionnaire& GetGestionnaire<A2::Gestionnaire>() {return gest2;}
    template <> A3::Gestionnaire& GetGestionnaire<A3::Gestionnaire>() {return gest3;}

Discussions similaires

  1. renvoyer une instance d'un membre d'une classe
    Par touftouf57 dans le forum Débuter
    Réponses: 3
    Dernier message: 26/11/2010, 12h07
  2. Réponses: 6
    Dernier message: 20/04/2007, 15h45
  3. Exporter une instance de classe au format XML ou XMI
    Par Scorpion Rouge dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/12/2005, 11h19
  4. Réponses: 4
    Dernier message: 13/12/2005, 09h01
  5. Réponses: 6
    Dernier message: 06/12/2004, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo