2

我是 C++ 新手,我正在尝试使用 C++ 和 SDL 进行一些测试,在 SDL 中我们有一个函数:

SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param);

我可以为创建的计时器传递一个回调。但显然它将我的实例 this 转换为 *void 所以我无法在静态的更新方法上再次检索它,这很有趣,但 SDL_AddTime 不适用于非静态回调函数。

好吧,所以我的问题是,当尝试通过 void* param 参数调用公共方法渲染时,它抱怨不是指向对象类型的指针......

由于我无法控制 SDL_AddTime 函数并且必须传递所需的参数,因此有什么方法可以在 update 方法中再次获取 Character 实例?

谢谢

#include "Character.h"

Character::Character(void)
{
  timer = SDL_AddTimer(33, update, this);
  this->render(); // is called without problem
}

//static method
Uint32 Character::update(Uint32 interval,void* param)
{
  param->render(); // yields: 'void*' is not a pointer-to-object type;

  SDL_Event event;

  event.type = SDL_USEREVENT;
  event.user.code = 1020;
  event.user.data1 = param;

  SDL_PushEvent(&event);

  return interval;
}

void Character::render(void)
{
  printf("rendering character \n");
}
4

4 回答 4

5

您不需要 reinterpret_cast - static_cast 应该没问题:

Character * cp = static_cast <Character *>( param );

您应该避免 reinterpret_cast - 它几乎总是特定于实现,并且可能隐藏问题 - 就像旧式 C 强制转换一样。

于 2010-01-02T21:31:40.740 回答
2

将参数指针转换为字符:

Character * charPtr = reinterpret_cast<Character *>(param);
charPtr->render();
于 2010-01-02T21:21:11.137 回答
2

原因是 C++ 是一种强类型语言。要将一种类型更改为另一种类型,您需要先转换它:

Uint32 Character::update(Uint32 interval, void* param)
{
    reinterpret_cast<Character* >(param)->render();

    /* ... */
}
于 2010-01-02T21:24:45.963 回答
2

仅供参考,如果你要在一个函数中调用很多东西,把所有讨厌的 reinterpret_cast 东西保存在你可以做的任何地方

Character * myCharacter = reinterpret_cast<Character* >(param);

然后让你做'myCharacter->render();' 或者你有什么...

于 2011-01-09T21:29:23.110 回答