gpt4 book ai didi

c++ - 如何实现作为虚函数的回调?

转载 作者:行者123 更新时间:2023-11-30 01:27:04 25 4
gpt4 key购买 nike

我正在使用 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 的实例。

最佳答案

定义一个为您调用虚函数的非虚函数,并将非虚函数附加到回调。

#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 仿函数中所做的,尽管它依赖于编译时而不是运行时多态性。

关于c++ - 如何实现作为虚函数的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com