2017-05-20 3 views
0

C'est ce que j'essaie de faire: j'ai une classe avec un membre (atribute) qui est un pointeur de fonction. Dans le créateur, je veux assigner certaines méthodes de la même classe à ce pointeur (en fonction de certaines conditions) et l'utiliser après d'autres méthodes. Par exemple:C++: Est-il possible d'affecter une méthode à un membre de fonction-pointeur (atribute) dans la même classe?

class monton 
{ 
private: 
protected: 

    bool (*comparador)(int a, int b); 

    inline bool mayor(int a, int b) {return a > b;} 
    inline bool menor(int a, int b) {return a < b;} 
    ... 

public: 
    monton (bool maximo = true) 
    { 
    if(maximo) comparador = mayor; 
    else  comparador = menor; 
    } 
    ... 
}; 

Quand je compile ce code dans CodeBlocks, je reçois cette erreur:

error: cannot convert ‘monton::mayor’ from type ‘bool (monton::)(int, int)’ to type ‘bool (*)(int, int)’| 

Répondre

1

Cette erreur vous indique que vous essayez d'attribuer un pointeur à la fonction de membre non-statique à un variable du type pointeur de fonction régulière. correcte déclaration de pointeur serait:

bool (monton::*comparador)(int a, int b); 
// or even better with type alias 
using t_ComparadorPointer = bool (monton::*)(int a, int b); 
t_ComparadorPointer comparador; 
+0

Merci beaucoup. J'ai également eu des problèmes pour utiliser mon pointeur de fonction après avoir été désigné. Mais j'ai trouvé que je peux l'utiliser avec cette sintaxe: '(ceci -> * comparador) (x, y)' –

+0

Et j'ai dû asigner le pointeur avec cette sintaxe: 'comparador = & monton :: mayor;' Je me demande si c'est correct et convenable, ou si je fais des problèmes à l'avenir. Merci beaucoup. –

+0

Étant donné la nature de ces fonctions (ne dépendant en aucune façon d'une instance de classe), une meilleure alternative serait de les rendre statiques - elles peuvent ensuite être affectées à un pointeur de fonction. –