c++ - 将虚函数放入结构中

标签 c++ class struct event-handling virtual

我的目标是编写一个系统来处理游戏事件,这些事件可以由发生的某种事件触发,例如玩家步行杀死某物或获得元素或您拥有的东西。为此,我需要有一个在触发事件时执行的虚函数。这是我想做的事情的要点(我知道它在当前状态下不起作用,但这是我可以解释我的目标的最佳方式):

class EventManager
{
    public:
        typedef struct
        {
            virtual void run();
            bool triggered;
            std::string name;
        } Event;

        void newEvent(std::string eventName)
        {
            Event newEvent;
            newEvent.name = eventName;
            newEvent.triggered = false;
            eventStack.push_back(newEvent);
        }

        void triggerEvent(std::string eventName)
        {
            std::vector<Event>::iterator itr;

            for(itr = eventStack.begin(); itr != eventStack.end(); itr++)
            {
                if(itr->name == eventName) itr->triggered = true;
            }
        }

        std::vector<Event> eventStack;
};

int main()
{
    EventManager* myEventManager = 0;
    myEventManager = new EventManager();

    myEventManager->newEvent("Event1");
    myEventManager->eventStack.back()::run()
    {
        std::cout << "Event1 has been triggered";
    }

    std::vector<EventManager::Event>::iterator itr;

    for(itr = myEventManager->eventStack.begin(); itr != myEventManager->eventStack.end(); itr++)
    {
        if(itr->triggered)
        {
            itr->run();
            itr->triggered = false;
        }
    }

    return 0;
}

所以基本上我的问题是,我如何允许我的库的用户定义事件触发时发生的情况,而不必让他们为每个事件编写类或其他东西?

最佳答案

考虑一下:什么是真正的事件?事件(从其实现的角度来看)只是处理程序(回调)的列表。

你所谓的 Event 实际上是一个代表事件处理程序的类,而你的 EventManager 就是事件本身。

您的问题的解决方案非常简单:使用函数引用(函数指针、lambda、仿函数)来存储处理程序集。例如:

template<typename... ARGS>
struct event
{
   typedef void(*)(ARGS...) handler_type;


   void add_handler(handler_type handler)
   {
        handlers.push_back(handler);
   }

   void raise_event(ARGS args...)
   {
        for(handler_type handler : handlers)
            handler(args...);
   }

private:
    std::vector<handler_type> handlers;
};


void on_foo(int a,int b) { std::cout << "on foo!!! (" << a << "," << b << ")" << std::end; }


int main()
{
    event<int,int> foo;

    foo.add_handler(on_foo);

    foo.raise_event(0,0);
}

上面的实现可以使用完美转发进行优化,但我不想让示例过于复杂。

关于c++ - 将虚函数放入结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19235934/

相关文章:

c++ - 如何从 Linux 交叉编译为 32 位 Windows 可执行文件

c++ - 为什么我们在使用C++11的<thread>时一定要链接pthread?

c - 在结构中使用 gettext 时初始值设定项无效

c - 初始化包含指向另一个结构的结构指针的结构

c++ - 声明变量时 : variable not declared in this scope

c++ - 我可以将结构数组别名为结构成员数组吗?

c++ - 三个一维或一个二维

c++ - 如果我对数组使用 delete p 而不是 delete [] p,结果会怎样?

C++ 类前向声明

python - 在 Python 中将 __delitem__ 与类对象而不是实例一起使用