Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Callback sur méthode de classe

2 réponses
Avatar
TSalm
Bonjour,

J'ai un callback de la forme "void (*callback)(void* data)" que je dois
utiliser pour que ma classe appelle une de ses méthodes.
Ça pourrait être simple : je déclarerais une fonction qui prendrait
l'instance de la classe en argument(dans "data" de "*callback").
Seulement :
1- cette méthode à appeler est privée
2- la fonction pointée par le callback ne doit pas être accessible par
autre chose que cette classe

J'ai donc pensé à utiliser une fonction "friend" déclarée dans un espace
de nom anonyme.
Ce qui me donne cette erreur de compilation :
'void<unnamed>::friendMeth(nm_test::A&)' should have been declared
inside '::'

Voilà un code pour illustrer cette erreur :

/*=========== Fichier Test.hpp ====================*/

#include <iostream>

#ifndef TEST_HPP_INCLUDED
#define TEST_HPP_INCLUDED

using namespace std;


// Prototype de ma classe A
namespace nm_test
{
class A;
}


// Le passage par cette fonction est imposée
// Il faut que j'appelle ma méthode par le pointeur en argument de cette
fonction.
void CallBack(void(*funcPtr)(nm_test::A&),nm_test::A& a);


// Prototype de ma classe Friend sur laquelle va pointer FuncPtr
// Cette fonction est anonyme car elle doit être visible seulement par la
classe "A"
namespace
{
void friendMeth(nm_test::A& a);
}

namespace nm_test
{
class A
{
private:
// Une variable à afficher
int myVar;

friend void ::friendMeth(A& a);
public:
A()
{
myVar = 10;
}
void Display()
{
CallBack(::friendMeth,*this);
}
};

}

#endif // TEST_HPP_INCLUDED

/*=========== Fin fichier Test.hpp ==================*/



/*=========== Fichier Test.cpp ====================*/

#include "Test.hpp"

void CallBack(void(*funcPtr)(nm_test::A&),nm_test::A& a)
{
funcPtr(a);
}

void nm2::friendMeth(nm_test::A& a)
{
using namespace std;
cout << "In friendMeth : " << a.myVar << endl;
}

/*=========== Fin fichier Test.cpp ==================*/


/*=========== Fichier main.cpp ====================*/

#include "Test.hpp"


int main()
{
nm_test::A a;
a.Display();

return 0;
}


/*=========== Fin fichier main.cpp ==================*/


D'avance merci.
-TSalm

2 réponses

Avatar
Fabien LE LEZ
On Sat, 18 Jun 2011 00:42:04 +0200, TSalm :

J'ai un callback de la forme "void (*callback)(void* data)" que je dois
utiliser pour que ma classe appelle une de ses méthodes.

void CallBack(void(*funcPtr)(nm_test::A&),nm_test::A& a);



Je ne comprends pas d'où vient cette fonction (avec les "nm_test::"),
ni à quoi elle sert.

Si j'ai bien suivi, tu es dans le cas classique où tu veux appeler une
fonction externe, appelons-la "Ext", qui prend en argument une
fonction et un pointeur :

void Ext (void (*callback)(void* data), void* data);

Si c'est bien ça, le mieux est d'utiliser la solution classique :

void Ext (void (*callback)(void* data), void* data);

class A
{
private:

void foo()
{
Ext (static_bar, this);
}

static void static_bar (void* ptr)
{
static_cast<A*>(ptr)-> bar();
}

void bar()
{
// ...
}
};
Avatar
TSalm
J'ai un callback de la forme "void (*callback)(void* data)" que je dois
utiliser pour que ma classe appelle une de ses méthodes.



void CallBack(void(*funcPtr)(nm_test::A&),nm_test::A& a);



Je ne comprends pas d'où vient cette fonction (avec les "nm_test::"),
ni à quoi elle sert.

Si j'ai bien suivi, tu es dans le cas classique où tu veux appeler une
fonction externe, appelons-la "Ext", qui prend en argument une
fonction et un pointeur :

void Ext (void (*callback)(void* data), void* data);

Si c'est bien ça, le mieux est d'utiliser la solution classique :

void Ext (void (*callback)(void* data), void* data);

class A
{
private:
void foo()
{
Ext (static_bar, this);
}
static void static_bar (void* ptr)
{
static_cast<A*>(ptr)-> bar();
}
void bar()
{
// ...
}
};




C'est exactement $ce que je cherchais, et c'est encore plus simple que ce
que je pensais (qui a dit que C++ était compliqué ? ;-) )
Un grand merci Fabien !