首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现虚函数的回调?

如何实现虚函数的回调?
EN

Stack Overflow用户
提问于 2012-02-23 10:10:02
回答 3查看 3.4K关注 0票数 1

我使用的是wxWigets,但我想这个问题更多的是如何实现虚拟函数的回调。这是我的代码的(非常)简化版本:

代码语言:javascript
运行
复制
// 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的一个实例。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-23 10:11:29

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

代码语言:javascript
运行
复制
#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所做的,尽管它依赖于编译时而不是运行时多态性。

票数 5
EN

Stack Overflow用户

发布于 2012-02-23 10:53:13

根据您的评论中的解释,似乎您需要:

  • 使能够识别Animal
  • define的MyGUI.h中的代码成为指向唯一Animal实例

的指针的全局存储

可能是这样的:

代码语言:javascript
运行
复制
// 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模式。

票数 0
EN

Stack Overflow用户

发布于 2012-02-26 07:37:56

对我来说起作用的是:

代码语言:javascript
运行
复制
class MyGUIChild : public MyGUI {
    Animal* animal_ptr; 

    void onFeedButton_cb( wxCommandEvent& event ) { 
        animal_ptr->feed(); 
    }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9406168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档