C++ 中的一种 addeventlistener

A kind of addeventlistener in c++

本文关键字:一种 addeventlistener C++      更新时间:2023-10-16

我认为它在 c++ 中不存在,但它会非常方便。假设我有一个班级:

class SPRITE
{
    void RunTo(POINT pt);
    SPRITE(MAINCLASS* main);
}

还有一个主要功能:

SPRITE sprite=new SPRITE();
while(1)
{
    GetCursorPos(&pt);
    FrameMove(frame,pt);
}

因此,如果我想用光标位置调用SPRITE::RunTo,我需要从主循环调用它,这对于一个类来说很简单,但对于许多类来说则更少。

我正在考虑的好事是这样的:

SPRITE::SPRITE(MAINCLASS* main)
{
    main->AddListener(main::Framemove(int frame,POINT pt){ RunTo(pt); });
}

这是一个纯粹的发明,但也许有一些东西可以做同样的事情?

谢谢

所以感谢 Rusty,这就是我所做的:

在主要.cpp:

struct PFUNC
{
    void (*func)(void* classvar, void* arg0);
    void* classvar;
}
vector <PFUNC> onFrameMove;
void FrameMove(int frame,POINT pt)
{
    #some jobs here
    for(int i=0;i<onFrameMove.size();i++)
         onFrameMove[i].func(onFrameMove[i].classvar, onFrameMove[i].arg0);
}

在SPRITE中.cpp:

SPRITE::SPRITE(MAINCLASS* main)
{
    PFUNC fc;
    fc.classvar = this;
    fc.func = &FrameMoveCB;
    main->onFrameMove.push_back(fc);        //add to the main job
}
void FrameMoveCB(void* classobject, void* arg0)   //callback to translate the void*s
{
    SPRITE* Sprite= (SPRITE*)classobject;
    Sprite->FrameMove(*(POINT*)arg0);     //call the true method
}
void SPRITE::FrameMove(POINT pt)
{
    //more job here
}

所以我的主循环处理所有工作,我不必在添加新类时修改它。

如果有人有更简单的,我会很高兴,但我认为这很好(而且它有效)

相关文章: