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 :

Méthode en paramètre.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 63
    Par défaut Méthode en paramètre.
    Hello.

    Imaginons que j'ai créé cette classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<class T> class A
    {
    	A(void *pf)
    	{
    		T *var= reinterpret_cast<T*>(pf);
    		var->FonctionAExecuter();
    	}
    };
    Et qu'un utilisateur utilise ma classe A, comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    B::B(/*param*/)
    {
    	A<B> *var = new A(this);
    }
     
    void B::FonctionAExecuter()
    {
    	std::cout<<"OK";
    }
    Le code fonctionne (il affiche bien le "OK") mais le problème c'est que ma classe A doit connaitre le nom de la fonction (FonctionAExecuter).
    N'y a-t-il pas moyen que l'utilisateur puisse spécifier le nom de la fonction comme ceci : A *var = new A(this->FonctionAExecuter); ?

    Thanks...

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Si, c’est possible de passer un pointeur de fonction membre.

    Exemple :

    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
     
    class A
    {
    	public:
    	A(){}
     
    	void functA()
    	{
    			cout << "echoA\n";
    	}
    };
     
     
    int main(int argc, char *argv[])
    {
    	void (A::*pt_funct)();
     
    	pt_funct = &A::functA;
    	A a;
    	(a.*pt_funct)();
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    L’exemple n’est pas ce qui se fait de mieux , mais le principe est la !
    Donc il faut passer ton objet en paramètre ainsi qu’un pointeur de fonction membre

    Et ensuite faire un appel de la fonction de la forme


  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 63
    Par défaut
    Merci pour ses 2 réponses...mais :

    1) J'ai du mal à comprendre en quoi les foncteurs pourrait m'aider ?!
    2) J'ai fait ceci:
    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
    class B;
     
    /****************************************************
    * Class A
    ****************************************************/
    template<class T> class A
    {
    	public:
    		A(void *pt_class, void (B::*pt_funct)())
    		{
    			T *var= reinterpret_cast<T*>(pt_class);
    			(var->*pt_funct)();
    		}
    };
     
    /****************************************************
    * Class B
    ****************************************************/
    class B
    {
    	public:
    		B(void)
    		{
    			A<B> *var = new A<B>(this, &B::FonctionAExecuter);
    		}
     
    		void FonctionAExecuter()
    		{
    			cout<<"OK";
    		}
    };
    Le code fonctionne...mais je retombe à peu près sur le même problème.
    Si l'utilisateur cré une class nomé "B" : ça fonctionne mais si elle ne s'apelle pas "B"...erreur !

    Je supose qu'il faut utiliser une autre template dans ma classe A pour éliminer le "B::" de ma class A. Mais comment faire ?

  5. #5
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je supose qu'il faut utiliser une autre template dans ma classe A pour éliminer le "B::" de ma class A. Mais comment faire ?
    Tu l'as déjà : c'est T. Tu pourras d'ailleurs également remplacer ce void* par un joli T*.

    Note que tu peux grandement simplifier les choses si tu utilises boost::function et boost::bind.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 63
    Par défaut
    Oui c'est vrai que je ferait mieux de remplacer mon "void *" par T

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A(T *pt_class, void (B::*pt_funct)())
    {
    	(pt_class->*pt_funct)();
    }
    Mais que faut-il remplacer par "T" dans le deuxième paramètre ? "B::" ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. méthode avec paramètre
    Par MaitrePylos dans le forum Ruby on Rails
    Réponses: 9
    Dernier message: 21/06/2007, 09h26
  2. [D7] Méthode pour paramétrer une application
    Par paros59 dans le forum Delphi
    Réponses: 6
    Dernier message: 18/06/2007, 23h50
  3. Réponses: 1
    Dernier message: 11/06/2007, 17h44
  4. [Conventions]Méthodes et paramètres
    Par Baptiste Wicht dans le forum Langage
    Réponses: 14
    Dernier message: 07/02/2007, 11h46
  5. Réponses: 7
    Dernier message: 06/05/2006, 15h06

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