Pointeur vers fonction membre statique

Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
- - Dernière réponse : cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
- 5 mai 2009 à 17:55
Bonjour à tous,
Voici mon problème (qui n'en est pas un, mais plutôt une question de style):
J'ai une classe statique, que nous nommerons Manager (secret pro oblige, je peut pas donner son vrai nom), et une classe Profile.
J'ai aussi un typedef de ce style :
Profile* (Manager::*cfao_func) (Profile*, double, double);

jusque la tout va bien.
Maintenant je voudrai déclarer des fonctions membre de Manager qui respectent la signature cfao_func. Comment puis-je faire?
En faisant :
Profile* maFonction(Profile*, double, double)
ça marche. Mais n'y a t'il pas moyen d'utiliser le typedef pour déclarer maFonction ????
D'avance, merci.
Afficher la suite 

5 réponses

Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Je n'ai pas compris ta question, mais je pense que tu as du mal à utiliser des pointeurs sur membres. Voici donc un petit exemple qui pourra, je l'espère, t'aider.

<tt>#include

#define callMemberFunction(object, ptrToMember)  ((object).*(ptrToMember))

class Profile
{
};

class Manager
{
public:
  Profile* maFonction(Profile*, double, double);
};

typedef Profile* (Manager::*cfao_func) (Profile*, double, double);

Profile*
Manager::maFonction(Profile*, double, double)
{
  std::cout << "Hello" << std::endl;
  return 0;
}

int main()
{
  Manager manager;
  cfao_func pFunc = &Manager::maFonction;

  (manager.*pFunc)(0, 0, 0);
  callMemberFunction(manager, pFunc) (0, 0, 0);
  return 0;
}
</tt>
Commenter la réponse de cptpingu
Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
0
Merci
Bonjour,
D'abord merci de m'accorder du temps.
Je vois bien que tu n'as pas compris ma question
Mais, en essayant de la reformuler, je me rend compte qu'elle est en fait débile....
Mais bon, par principe je la pose quand même!
je voudrais utiliser le typedef pour DECLARER maFonction.
Ce qui donnerai
&cfao_func maFonction;
à la place de :
Profile* maFonction (Profile*,double,double);

...
je sais, c'est tordu et pas très utile, mais ça serait joli!!! (et les informaticiens aiment le joli )
Commenter la réponse de Seomaz
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Effectivement, je n'avais pas compris ta question :)

En revanche, j'ai toujours du mal à comprendre ta question. Pourrais-tu reprendre l'exemple que j'ai écrit pour montrer ce que tu cherches à réaliser ?

> &cfao_func maFonction;
> à la place de :
> Profile* maFonction (Profile*,double,double);
D'un point de vue théorique, je ne pense pas que ça soit équivalent. La 2ème expression est la fonction, et la 1ère un pointeur. C'est space oO.
Commenter la réponse de cptpingu
Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
0
Merci
je vais essayer de manière formelle:
je voudrais déclarer un fonction à partir de la signature d'un pointeur de fonction, sans retaper les types d'entrée et de retour.
Avec l'exemple :

<tt>class Profile
{
};

class Manager
{
public:
  </tt><tt>typedef Profile* (Manager::*cfao_func) (Profile*, double, double);</tt>
<tt><strike>  Profile* maFonction(Profile*, double, double);
</strike>  &cfao_func maFonction;
};

Profile*
Manager::maFonction(Profile*, double, double)
{
  std::cout << "Hello" << std::endl;
  return 0;
}

int main()
{
  Manager manager;</tt>
    <tt>manager.maFonction(...);
...
}

Je tiens à te rappeler que ce n'est pas important, c'est juste pour le style, et ma culture perso. Donc si ça te *******, c'est pas grave
</tt>
Commenter la réponse de Seomaz
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Ce n'est pas possible puisque l'écriture barré est une déclaration de signature, et que l'autre est une déclaration de variable. Donc ça ne peut pas fonctionner.

En revanche, je peux te proposer ceci, qui n'est pas terrible, mais fonctionne (J'aurais aimé que l'on ne soit pas obligé de préciser le nom de la classe, mais la macro __class__ n'existe pas :s).

#include

#define declare_member(ReturnType, ClassName, Name, Args)    \
  ReturnType Name Args;                        \
  typedef ReturnType (ClassName::*p_##Name) Args

#define callMemberFunction(object, ptrToMember)  ((object).*(ptrToMember))

class Profile
{
};

class Manager
{
public:
  declare_member(Profile*, Manager, maFonction, (Profile*, double, double));
  // Generera cela
  //   Profile* maFonction(Profile*, double, double);
  //   typedef Profile* (Manager::*p_maFonction) (Profile*, double, double);
};

Profile*
Manager::maFonction(Profile*, double, double)
{
  std::cout << "Hello" << __func__ << std::endl;

  return 0;
}

int main()
{
  Manager manager;
  Manager::p_maFonction pFunc = &Manager::maFonction;

  (manager.*pFunc)(0, 0, 0);
  callMemberFunction(manager, pFunc) (0, 0, 0);
  return 0;
}
Commenter la réponse de cptpingu