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 :

Pointeur sur fonction membre non static


Sujet :

C++

  1. #1
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut Pointeur sur fonction membre non static
    Bonjour,

    J'ai une class A de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class A
    {
    public:
        static void foo();
    private:
        int a;
    }
    J'initialise un pointeur sur ma fonction foo : (void)(*ptr)(void). Je passe ce pointeur à un thread pour qu'il rappelle foo quand cela sera nécessaire. Ceci fonctionne très bien mais (parce que sans mais je ne poserais pas de question) je souhaite modifier la variable 'a' via foo.

    Le problème que j'ai est donc :
    - pour modifier a je ne doit pas mettre le mot clé static
    - pour utiliser un pointeur sur fonction d'une méthode, il faut qu'elle soit static.

    Existe-il un tricks pour contourner mon problème ?

    Cordialement,
    Robin

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si le seul prototype auquel tu aies droit est void (*ptr)(void), alors tu n'as pas d'autre solution que d'utiliser une variable globale/statique/TLS/etc. pour transporter le this.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Bien vu.

    Pour le moment je faisais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void (*ptr)(void);
    ptr = &A::foo;
    Tu me propose de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void (*ptr)(A*);
    ptr = &A::foo;
    Et a mon thread je lui envoie le nouveau pointeur sur fonction ET le pointeur sur mon instance de A ?

    Après pour des soucis de classe auto-imbriqué je préférerais ne pas avoir a inclure A dans mon thread.
    Peut être qu'avec un système d'héritage ça pourrait être propre.

    EDIT : Dans mon projet, un objet de ma classe A instancie un objet de ma classe B qui fabrique un thread effectuant une MAJ sur mon objet A.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    La manière la plus générique, mais pas la plus C++ (c'est la manière qu'on voit le plus souvent pour les threads, d'ailleurs), c'est ceci:
    Code C++ : 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
    class A
    {
    public:
    	void foo();
    	static void Sfoo(void *p) { static_cast< A* >(p)->foo(); };
    private:
    	int a;
    };
     
    ...
     
    void (*ptr)(void*);
    void *ptrData;
     
    A* pA = new A;
    ptr = &A::Sfoo;
    ptrData = pA;
     
    LaunchNewThread(ptr, ptrData);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Merci

    Je vois enfin une utilité concrète au (void*).
    Les appelles de fonction se font très bien.

    Bon après j'ai toujours un petit problème au niveau de mes mutex mais ça sera peut-être pour un autre thread

    Merci beaucoup pour ton aide !

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Peux tu modifier le type du pointeur de fonction ?

    Si oui transforme ça en std::function<void()> et l'utilisation est simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A {
       std::function<void()> getFunction() const {
          return [this]() { foo(); };
       }
     
       void foo() { a = 5; }
       int a;
    };
     
    A a;
    std::function<void()> func = a.getFunction();

  7. #7
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Je ne connaissais pas le conteneur function.
    Je vais tester les deux méthode pour voir.

    Merci a vous

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

Discussions similaires

  1. Pointeur sur fonction membre non static
    Par robinsondesbois dans le forum Débuter
    Réponses: 11
    Dernier message: 02/07/2014, 16h57
  2. [POO] Pointeur sur fonction membre et héritage
    Par MrDuChnok dans le forum C++
    Réponses: 9
    Dernier message: 20/07/2006, 17h19
  3. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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