Pointeur vers fonction membre statique

Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 mai 2009 - 5 mai 2009 à 15:17
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 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.

5 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
5 mai 2009 à 16:01
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>
0
Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 mai 2009
5 mai 2009 à 16:12
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 )
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
5 mai 2009 à 16:18
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.
0
Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 mai 2009
5 mai 2009 à 17:09
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>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
5 mai 2009 à 17:55
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;
}
0
Rejoignez-nous