2017-10-25 11 views
0

C++にはないと思いますが、とても便利でしょう。C++のaddeventlistenerの一種

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

そして主な機能::だから私は、私はと簡単ですメインループからそれを呼び出す必要があり、カーソル位置でSPRITE::RunToを呼び出したい場合は

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

は、私はクラスを持っていると言います一つのクラスだが、多くは少ない。

私は考えている良いことは、そのようなものです:

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

それは純粋な発明だが、多分同じことを行うことができるものがありますか?

おかげ

+0

C++は 'FrameMove'も' AddListener'もありません。 – harper

+0

"メンバー関数へのポインタ"を参照してください。 – rustyx

+0

@harper私はそれが私の問題を理解できるようにする表記であることを知っています。 – Entretoize

答えて

0

ラスティのおかげので、これは私が作ったものである。

main.cppには:SPRITE.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::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 
} 

だから私のメインループはすべてのジョブを処理するので、新しいクラスを追加するときに変更する必要はありません。

誰かが単純なを持っている場合、私は幸せになるだろうが、それは私が考える(とそれを動作)良いことだ