2010-09-05 3 views

Répondre

1

Voici comment vous le faites (et Impress/horrifier vos vaches-es travailleurs en même temps):

#include <iostream> 

class MyClass 
    { 
public: 
    void (MyClass::*OnShow)() ; 
    void OnShowFunction() ; 
    } ; 

int main (int argc, char** argv) 
    { 
    MyClass C ; 
    C.OnShow = MyClass::OnShowFunction ; 
    (C.*C.OnShow)() ; 
    } 

void MyClass::OnShowFunction() 
    { 
    std::cout << "void MyClass::OnShowFunction()\n" ; 
    } 
+0

Merci TonyK, j'ai réussi à faire ça, j'ai juste fait quelques changements: void OnShowFunction() {/ * Faire Stuff * /} class MyClass { public: void (* OnShow)(); }; int principal (int argc, char ** argv) { MyClass C; C.OnShow = OnShowFunction; (* OnShow)(); } –

1

Oui, c'est possible.

Vous devez utiliser un pointeur de fonction ou un encapsuleur qui encapsule des pointeurs de fonction et d'autres objets appelables, tels que function, que vous pouvez trouver sous différentes formes en C++ 0x, C++ TR1 et Boost. Selon la façon dont vous utilisez les rappels, une bibliothèque de signaux comme Boost.Signals peut être plus élégante.

6

Vous pouvez utiliser des pointeurs de fonction ou std::function (également dans BOOST) pour y parvenir. Cependant, il semblerait que vous essayiez d'adopter un style de programmation javascript ou langage de script en C++ - je vous en avertis, vous devriez changer votre style de programmation en fonction de la façon dont il s'adapte à la langue. Une alternative typique en C++ est d'avoir onShow une méthode virtuelle qui peut être surchargée par des dérivées.

3

Vous ne voulez probablement pas changer dynamiquement la fonction au moment de l'exécution, Si vous le faites alors l'une des autres réponses vous montrera comment utiliser les foncteurs. Mais pour moi, il semble que vous vouliez que différents objets aient des fonctionnalités différentes basées sur certaines propriétés de l'objet.

C'est ce que la fonction virtuelle sont pour:

Vous définissez l'action dans la classe de base. Ensuite, dans une classe dérivée, vous donnez l'implémentation réelle en fonction de la façon dont l'objet est censé agir.

class MyClass 
{ 
    public: 
     virtual void onShow() = 0; 
}; 

class Window: public MyClass 
{ 
    public: 
     virtual void onShow() { /* Draw Window */ } 
}; 

void aboutToShowObject(MyClass& obj) 
{ 
    obj.onShow(); 
} 
+2

+1 et notez que lorsque Martin dit que vous ne changerez pas la fonction lors de l'exécution de cette façon, il n'a pas Cela signifie que vous n'avez pas le choix de l'objet que vous voulez créer lors de l'exécution. Vous pouvez toujours créer une classe dérivée ou l'autre en fonction du contexte. Functor ou wrapper comme std :: function ne sont utiles que si vous voulez changer la fonction pendant la durée de vie de l'objet. – log0

0

Vous pouvez utiliser std :: fonction qui est une classe wrapper qui vous permettra d'affecter foncteurs ainsi que des fonctions C de manière sûre.
Cependant, l'utilisation d'un foncteur Hiérarchie est une solution très simple. Ensuite, comme d'habitude, des fonctionnalités spécifiques d'onShow doivent être utilisées par le biais de membres de fonction virtuelle.

+0

Notez que le cycle de vie/cycle de vie d'onShow est différent de celui d'obj, comparé à la réponse de Martin. – log0

0

Si vous souhaitez modifier dynamiquement le pointeur de la fonction lors de l'exécution, vous pouvez conserver le pointeur de fonction en tant que membre et utiliser une méthode par défaut appelée OnShow() qui appelle le pointeur de fonction:

#include <iostream> 
using namespace std; 

void OnShow() { 
cout << "Showing!" << endl; 
} 

typedef void(*EventProc)(); 

class Widget { 
private: 
EventProc m_ep; 
public: 
Widget() : m_ep(0) {} 
void SetOnShow(EventProc ep) {m_ep = ep;} 
void OnShow() {(*m_ep)();} 
}; 

int main() { 
Widget w; 
w.SetOnShow(::OnShow); 
w.OnShow(); 
return 0; 
} 
Questions connexes