c++ - 如何向创建对象的类发送消息

标签 c++ winapi events event-handling callback

我想将数据发送回创建该对象的类。

这是游戏相关的。 敌人对象具有线程函数并在场景中自行移动。

如果您将创建对象的类的头文件包含到对象本身......以传递指针,则会产生很多错误。

敌人类别:

Class Enemy
{
   private:
      void (*iChange)(DWORD &);
}:
Enemy::Enemy(void (*iChangeHandler)(DWORD &) ) : iChange(0)
{
    this->iChange = iChangeHandler;
}
    void Enemy::Draw(D3DGraphics& gfx)
{
    this->iChange(this->dwThreadID); // send a message back to the class that created me

    gfx.PutPixel(this->my_position_x + 0,this->my_position_y,this->red,this->blue,this->green);
    this->grafix->DrawCircle(this->my_position_x + 0,this->my_position_y, this->radius, this->red,this->blue,this->green);

    (sprintf)( this->enemy_buffer, "X: %d, Y: %d", this->my_position_x , this->my_position_y);
    this->grafix->DrawString( this->enemy_buffer, this->my_position_x , this->my_position_y, &fixedSys, D3DCOLOR_XRGB(255, 0, 0) );
}

游戏类:

struct enemies_array_ARRAY {
        std::string name;
        DWORD ID;
        Enemy* enemy;
    } enemies_array[25];

void Game::EnemyEvent(DWORD &thread_id)
{   
     enemies_array[0]...... // i want to acces this struct array
}

Game::Game(HWND hWnd)
{
    enemies_array[0].name = "john Doe";
    enemies_array[0].ID = NULL;
    enemies_array[0].enemy =  new Enemy(&Game::EnemyEvent);   
    // error: C2664:

    // another attemp
    enemies_array[0].name = "john Doe";
    enemies_array[0].ID = NULL;
    enemies_array[0].enemy =  new Enemy(Game::EnemyEvent);
    // error C3867: 
}

最佳答案

如果我没理解错的话,你想在 Game 对象上调用一个函数。这意味着您需要将一个指针传递给Game 对象,以便正确调用non static member function pointer。 (iChange) 就可以了。

进行如下所示的更改,你应该能够做你想做的事

enemies_array[0].enemy =  new Enemy(this,&Game::EnemyEvent);   

typedef void (Game::*ChangeFunc)(DWORD &)
Class Enemy
{
private:
   ChangeFunc iChange;
   Game *pGame;
}:

Enemy(Game *pCreatorGame, ChangeFunc iChangeHandler )
{
    iChange = iChangeHandler;
    pGame = pCreatorGame;
}

void Enemy::Draw(D3DGraphics& gfx)
{
    (pGame->*iChange)(this->dwThreadID);

关于c++ - 如何向创建对象的类发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13787181/

相关文章:

events - 信号和槽 vs. 事件和事件监听器

javascript - dispatchEvent() 函数作为参数,执行函数而不是传递它

c++ - Winsock ~ 创建一个 UDP 监听器(多个与 1 个套接字)

c++ - Turbo C 中的 SVGA 编程

c++ - 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

c# - .NET 中的 SetForegroundWindow 问题

c - 如何以编程方式确定 Windows 是否正在关闭?

c++ - 使用 size() 返回当前在我的类中的元素数 (c++)

c++ - Libharu 使用 windows.h 创建有关 pngtest.c 的错误

C# 如何让线程等待两个手动重置事件中的任何一个?