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 :

C++ / Class / apeller methode qui est contenue dans une chaine de caractére


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 6
    Par défaut C++ / Class / apeller methode qui est contenue dans une chaine de caractére
    Bonjour,

    J'aimerai apeller une methode qui arrive sous format de chaine de caractére dans mon constructeur.

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Class Test
    {
    public:
     Test(char * NomFunction)
    {
      // Si NomFunction = function1, apeller la methode function1
      // Si NomFunction = function2, apeller la methode function2
     
     };
     inline function1() {};
     inline function2() {};
    }
    J'aimerai éviter d'utiliser les strcmp et plustot utiliser une fonction de type 'g_idle_add' qui est sous GTK.

    Merci pour votre aide.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    La classe string de la stl peut répondre à ce besoin :
    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
    #include <string>
    using namespace std;
    class Test // /!\ Attention, pas de majuscule à class
    {
       public:
       Test(char * NomFunction)
       {
          // vérifier que NomFunction est correct.
          string szFunctionName = NomFunction; // conversion de la chaine en std::string
          if("function1" == szFunctionName){
             function1();
          }
          else if("function2" == szFunctionName){
             function2();
          }
       };
       inline void function1() {}; // attention aux types
       inline void function2() {};
    }; // atttention à ne pas oublier le point virgule.
    D'une manière générale, en c++, il vaut mieux préférer std::string aux char * (par exemple ici dans le constructeur), les performances sont à peu pret équivalentes et de nombreuses heures de debogage sont évitée.
    De plus si une chaine de charactères est vraiment nécessaire à quelque appel de fonction externe, une conversion de std::string en chaine est toujours possible vi la méthode c_str().

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 6
    Par défaut
    Hello,
    Mon probléme est que j'aurais un nombre imporant de fonction a apeller.
    J'aimerai donc lieu de mettre en place des "switch, strcpm, string compare, ennum, ..." je voudrai savoir si c'est possible de faire cela:

    fonction_magique_cpp (NomFunction); // cela apelle la fonction.

  4. #4
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    une hasp map statique avec des std::string en clé et des boost::function en objet le tout enregistré avec des méthodes statiques ?
    Ca peut pas le faire ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    la map me semble aussi la meilleur approche. Si tes fonctions ont la même signature, tu peux directement utliser des pointeur de fonction dans ta map (mais attention aux écritures délicates avec les pointeurs sur membres de classes).
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
    #include <string>
    #include <map>
     
    using namespace std;
     
    class Test
    {
    public:
    	void function1()
    	{
    		cout << "function1()" << endl;
    	};
    	void function2()
    	{
    		cout << "function2()" << endl;
    	};
    private:
    	typedef void (Test::* TMembreFnc)();
    	typedef map<string,TMembreFnc> TMapFnc;
     
    	static TMapFnc CreateMap()
    	{ 
    	   TMapFnc Result;
     
    	   Result["function1"] = &function1;
    	   Result["function2"] = &function2;
     
    	   return Result;
    	}
     
    	static TMapFnc & GetMap()
    	{
    		static TMapFnc MapFnc = CreateMap();
    		return MapFnc;
    	}
    public:
    	void Invoque ( const string & NomFunction)
    	{
    		TMapFnc & MapFnc = GetMap();
    		TMapFnc::iterator iter = MapFnc.find(  NomFunction );
    		if( iter != MapFnc.end() )
    		{
    			(this->*(iter->second))();
    		}
    	};
    };

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pour info, c'est un sujet qui revient 1 fois par mois sur le forum C++. Une petite recherche avec les mots clés "map std::string fonction" dans le forum C++ t'apportera énormément de détails sur cette pratique

Discussions similaires

  1. [WD16] Executer formule contenu dans une chaine de caractère
    Par J0r_x dans le forum WinDev
    Réponses: 1
    Dernier message: 02/11/2011, 14h39
  2. Instancier une classe dont le nom est contenu dans une String
    Par fyque dans le forum Général Python
    Réponses: 15
    Dernier message: 13/06/2008, 12h33
  3. Réponses: 2
    Dernier message: 02/10/2007, 11h42
  4. [VB6] Parser XML contenu dans une chaine de caractère
    Par pegase06 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/09/2007, 11h35
  5. Réponses: 2
    Dernier message: 13/08/2006, 23h56

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