我使用的是wxWigets,但我想这个问题更多的是如何实现虚拟函数的回调。这是我的代码的(非常)简化版本:
// MyGUI.h
Class MyGUI : public wxFrame {
...
protected:
virtual void onFeedButton_cb( wxCommandEvent& event ) { event.Skip(); }
...
}
// Animal.h
Class Animal {
public:
void Feed();
}一个微不足道的问题:如何实现onFeedButton_cb回调,以便它可以访问Animal的Feed()函数?例如,在运行时,回调必须能够访问Animal的一个实例。
发布于 2012-02-23 10:11:29
定义一个为您调用虚函数的非虚函数,并将该非虚函数附加到回调。
#include <memory>
#include <iostream>
class Animal { virtual void Roar() { std::cout << "Roar!\n"; } };
class Rabbit : public class Animal { virtual void Roar() {
std::cout << "Rabbits don't roar, silly!\n"; } };
typedef void (*NonVirtualCallbackType)(Animal *);
void Callback(Animal *foo)
{
//Virtual call happens inside the callback
foo->Roar();
}
void FunctionUsingCallback(NonVirtualCallbackType callback, Animal *instance)
{
callback(instance);
}
int main()
{
std::unique_ptr<Animal> generals(new Animal());
std::unique_ptr<Animal> wabbits(new Rabbit());
FunctionUsingCallback(Callback, generals);
FunctionUsingCallback(Callback, wabbits);
}请注意,这种类型的转换正是std::mem_fun在幕后为STL functor所做的,尽管它依赖于编译时而不是运行时多态性。
发布于 2012-02-23 10:53:13
根据您的评论中的解释,似乎您需要:
AnimalMyGUI.h中的代码成为指向唯一Animal实例的指针的全局存储
可能是这样的:
// MyGUI.h
#include "Animal.h"
Class MyGUI : public wxFrame {
...
protected:
virtual void onFeedButton_cb( wxCommandEvent& event ) {
Animal::getTheAnimal()->Feed();
event.Skip(); }
...
}
// Animal.h
Class Animal {
private:
static Animal* theAnimal;
public:
static Animal& getTheAnimal() { return *theAnimal; }
public:
Animal() { theAnimal = this; }
public:
void Feed();
}另请参阅Singleton模式。
发布于 2012-02-26 07:37:56
对我来说起作用的是:
class MyGUIChild : public MyGUI {
Animal* animal_ptr;
void onFeedButton_cb( wxCommandEvent& event ) {
animal_ptr->feed();
}
}https://stackoverflow.com/questions/9406168
复制相似问题