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 :

structure / pointeur sur fonction


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 51
    Points : 32
    Points
    32
    Par défaut structure / pointeur sur fonction
    Bonjour tout le monde.

    J'ai une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          struct Operation
          {
                BOOL (*op) (BOOL, BOOL);
          } expression[MAX][1000];
    Quand je veux indiquer une fonction a mettre :

    expression[num_exp][indice].op = fonction_retournant_un_bool;

    Le compilateur me signale une erreur :

    "argument of type bool (fonction:(bool,bool) does not match bool(*)(bool,bool)"

    Quelqu'un saurai m'expliquer ?

    Merci : )

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjours,
    Je vois deux problèmes.
    1 - C'est un pointeur qu'attend op, donc il faudrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expression[num_exp][indice].op = &fonction_retournant_un_bool;
    2 - Tu tente apparemment de mètre un pointeur de fonction membre dans un pointeur de fonction ordinaire. Puisque "fonction_retournant_un_bool" appartient apparemment a la classe fonction.
    La solution est boost::bind
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fonction *maFonction = ... // initialisation d'un pointeur sur un objet fonction
    expression[num_exp][indice].op 
      = bind(&fonction::fonction_retournant_un_bool, maFonction, _1, _2);
    bind prend ta fonction de type:
    bool (fonction:: )(bool,bool)
    et la transforme en:
    bool (fonction*, bool, bool)
    Ensuite il remplace la fonction* par l'instance que tu lui passe, ce qui fait qu'au final tu obtien bien une fonction de type:
    bool (bool, bool)

    Si je ne suis pas clair, la doc se trouve ici:
    http://www.boost.org/doc/libs/1_36_0...bind/bind.html

    PS: après avoir testé, je me rend compte que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fonction *maFonction = ... // initialisation d'un pointeur sur un objet fonction
    typedef BOOL (*opType)(BOOL, BOOL);
    expression[num_exp][indice].op 
      = (opType)&bind(&fonction::fonction_retournant_un_bool, maFonction, _1, _2);
    sera plus approprié.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    Waw tu m'a un peu perdu, mais bien aiguillé.

    En fait je reprend un code écrit en C
    et de le faire fonctionner dans une IHM.

    Ca me permet d'apprendre a me servir de QT designer, et de voir pas mal de technique.

    Mon erreur viendrai donc du fait que ma structure est externe a une classe ? car elle est déclarée dans un .h a part.

  4. #4
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Le problème n'est pas que ta structure est externe a une class.
    Le problème est que le type de fonction que tu défini pour "op" est:
    BOOL (*op) (BOOL, BOOL);

    alors qu'une fonction membre d'une class serait de type:
    BOOL (TypeDeMaClass::*op) (BOOL, BOOL);

    Et le C++ est incapable de caster l'un en l'autre, car dans le deuxième cas, la méthode a besoin d'une class instanciée pour être appelée, c'est a dir qu'elle a implicitement 3 argument au lieu de 2.

    Je t'ai proposée une solution mais j'en vois deux autre:
    2 - op serait de type: BOOL (fonction::*op) (BOOL, BOOL);
    Mais ça impose que op ne pointe QUE sur des fonctions membres de la class "fonction"

    3 - Les fonctions pointées seraient des fonction static.
    Dans ce cas elles garderai la même définition que celle de op.

    La solution du précédent post est la seul qui ne t'impose aucune restriction, a par installer boost, mais tu verra boost c'est que du bonheur ^^

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    A yest, j'ai compris : p

    Je vais voir avec la première solution, vu l'heure, ça a l'air plus rapide ; )


    En tout cas, merci bien, j'aurai pas compris tout seul...

    Bonne fin de week end : )

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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