OVH Cloud OVH Cloud

Pointeur sur fonction membre

1 réponse
Avatar
Tanski Mikael
Hello,
J'ai un petit souci avec les pointeurs de fonctions membres.
Donc, j'ai une classe A et B dérivé.

Dans ma classe A j'ai les methodes :
void A::OnInitDialog();
void A::OnAcceptConnection();

Puis dans ma classe B j'ai les methodes :
void B::SetRegCllBkOnAccept( void (A::* func)() );
void B::OnAccept();
void (A::* m_cllbkOnAcc)();

(pour être plus concret, A c'est une boite de dialogue, et B une classe
dérivé de CAsynSocket (VC++))

Donc tous se passe dans la classe A, dans la methode OnInitDialog();

void A::OnInitDialog()
{
B sock;
sock.SetRegCllBkOnAccept(&A::OnAcceptConnection)
}

Et pour la classe B je séche, du moin j'ai essayé un peux tous se que je
trouvais sur deja.com :

void B::SetRegCllBkOnAccept( void (A::* func)() )
{
m_cllbkOnAcc = func;
}

void B::OnAccept()
{
(this->* m_cllbkOnAcc)(); // mouarf sa coince ici, a cause du
} // this surement qui de type B...


En faite se que je voudrais faire c'est que, quand B::OnAccept est
appelé, je voudrais que cela donne une sorte de transfére et que sa
appel A::OnAcceptConnection...

Enfin voila quoi j'ai jamais utilisé les pointeurs de membres, si
quelqu'un à compris se que je voulais faire et qu'il à la soluce, merci
à lui, oh pi merci aussi à ceux qui n'ont pas la soluce mais qui ont
prit le temps de lire mon post :-) .

1 réponse

Avatar
Vincent Richard

void A::OnInitDialog()
{
B sock;
sock.SetRegCllBkOnAccept(&A::OnAcceptConnection)
}

Et pour la classe B je séche, du moin j'ai essayé un peux tous se que je
trouvais sur deja.com :

void B::SetRegCllBkOnAccept( void (A::* func)() )
{
m_cllbkOnAcc = func;
}

void B::OnAccept()
{
(this->* m_cllbkOnAcc)(); // mouarf sa coince ici, a cause du
} // this surement qui de type B...


Ici, il te faut un objet de type 'A' pour appliquer la méthode
'm_cllbkOnAcc' (en fait, tu as mémorisé l'adresse de la méthode à
appeler, mais pas l'objet sur lequel l'appeler).

Tu peux passer ton objet A en paramètre de 'SetRegCllBkOnAccept' :

B sock;
SetRegCllBkOnAccept(this, &A::OnAcceptConnection)

et ajouter un membre 'm_a' de type A* dans 'B', qui sera affecté par la
fonction 'B::SetRegCllBkOnAccept' :

void B::SetRegCllBkOnAccept(A* a, void (A::* func)() )
{
m_a = a;
m_cllbkOnAcc = func;
}

Puis, dans B::OnAccept() :

m_a->*m_cllbkOnAcc();

Mais à mon avis, le mieux ici est de définir une interface (classe
abstraite en C++) qui va servir d'intermédiaire entre les deux objets :

class B_Listener // abstraite
{
public:

virtual ~B_Listener() { }

virtual void OnAccept() = 0;
};

class A : public ...., public B_Listener // implémente B_Listener
{
public:

void OnInitDialog()
{
B sock;
sock.setListener(this);
}

void OnAccept() { /* ... */ }
};

class B
{
B_Listener* m_listener;

public:

void setListener(B_Listener* l)
{
m_listener = l;
}

void OnAccept()
{
m_listener->OnAccept();
}
};

En fait, tout dépend du nombre de méthodes pour lesquelles tu dois
faire ça...

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/