begin process at 2012 05 29 13:48:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Pointeur vers des fonctions membres d'une classe


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pointeur vers des fonctions membres d'une classe

vendredi 1 avril 2011 à 08:45:24 | Pointeur vers des fonctions membres d'une classe

thoflo1

Bonjour,
J'utilise une méthode d'une classe issue d'une librairie c++, qui prend un pointeur vers une fonction en argument :
Code C/C++ :
typedef void (*fptr)(Type1&, Type2&);
Class A
{
  void methode1(fptr toto);
  ...
}

sachant que methode 1 stocke le pointeur fptr dans un vecteur, et l'utilise plus tard dans plusieurs autres méthodes.

Je souhaite générer une famille de fonctions dans une boucle:
f(Type1& var1, Type2&var2, int i), j'ai donc créé une classe

Code C/C++ :
class B
{
   int param;
   void f_B(Type1& var1, Type2& var2);
}
int main
{
A A1;
for(int i=1;i<N;i++){
  void (B::*fBPtr)(Type1&, Type2&);
  fBPtr = &B::f_B;
  B B1(i);
  A1.methode1((B1.*fBPtr)); 
}


J'obtiens l'erreur suivante :
error: invalid use of non-static member function

Quelqu'un peut-il m'aider ou me proposer une autre méthode pour parvenir à mes fins ?




vendredi 1 avril 2011 à 10:35:41 | Re : Pointeur vers des fonctions membres d'une classe

CptPingu

Administrateur CodeS-SourceS
librairie => bibliothèque, merci.

Malheureusement, un pointeur sur fonction et un pointeur sur fonction membre ont des types différents, et ne sont donc pas compatible.
Tu peux forcer un pointeur sur membre à "rentrer" dans un pointeur sur fonction, via "reinterpret_cast<fptr>(B1.*fBPtr)", mais tu auras un résultat erroné.

Tu peux tenter d'utiliser des membres statiques, qui sont au final de simple fonction.
Si tu peux modifier la bibliothèque, alors utilise du boost::bind + boost::function, qui remplace très avantageusement tous les pointeurs sur fonctions/membres.
Code C/C++ :
#include <iostream>

typedef int Type1;
typedef int Type2;

class B;
typedef void (*fptr)(Type1&, Type2&);
typedef void (B::*fBPtr)(Type1&, Type2&);

class A
{
 public:
  void methode1(fptr toto)
  {
    Type1 a = 5;
    Type2 b = 10;
    toto(a, b);
  }
};

class B
{
public:
  B(int param)
  {
    param_ = param;
    std::cout << param_ << std::endl;
  }
  static void f_B(Type1& var1, Type2& var2)
  {
    std::cout << "var1 = " << var1 << ", var2 = " << var2
	      << ", param = " << param_ << std::endl;
  }
private:
  static int param_;
};

int B::param_ = 0;

int main()
{
  A A1;
  for(int i = 0; i < 10; ++i)
  {
    B B1(i);
    A1.methode1(&B::f_B);
  }

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question


Cette discussion est classée dans : code, classe, void, pointeur, type1


Répondre à ce message

Sujets en rapport avec ce message

pourkoi pointeur vers classe ? [ par Arkko ] Quelquun peut m'expliquer pourquoi ce code cree un pointeur NULL vers un classe et apres quil declare un variable de type cMyD3dApplication et met une Pointeur vers une fonction dans une classe ... [ par MoDDiB ] Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon Cast void* - objet C++ [ par zaraki21 ] Bonjour, Je travaille actuellement sur un projet en C/C++ dans lequel je souhaite "caster" un membre d'une classe de type void* en un pointeur sur un Polumorphisme pointeur [ par yvesyves ] Bonjour, Admettons : [code=cpp]class A { private : .... protected : void Insertapres(A * nouveau, A * source = this){.....} }; classe B Opérateur de copie et pointeur [ par eupeup ] Bonjour à tous!!!! J'ai une petite question, et si quelqu'un pouvait m'aider, ce serait sympa... Donc ca concerne la définition d'un opérateur de cop découpage de classe - instanciation template [ par vdox ] Bonjour, j'ai créé une classe template. De façon très classique, la déclaration est dans le .hpp et la définition des fonctions dans le cpp. J'aimerai classe abstraite et interface (au sens Java pas graphique :d ) en C++ [ par lulafitt ] Bonjour, Comme précisé dans le sujet quand je parle d'interface je ne parle pas d'interface graphique mais bien d'interface comme dans Java. Ceci dit


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,203 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales