2

私はC++を初めて使用し、C ++とSDLを使用してテストを行おうとしていますが、SDLには次の関数があります。

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

作成されたタイマーのコールバックを渡すことができます。しかし、どうやらこれは私のインスタンスを* voidに変換するので、静的なupdateメソッドで再度取得することはできません。興味深いのですが、SDL_AddTimeは非静的コールバック関数では機能しません。

さて、私の問題は、void * param引数を介してパブリックメソッドrenderを呼び出そうとすると、オブジェクト型へのポインタではないことについて不平を言うことです...

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 );

古いスタイルの C キャストと同様に、reinterpret_cast はほとんど常に実装固有であり、問​​題が隠れている可能性があります。

于 2010-01-02T21:31:40.740 に答える
2

その理由は、C++ が強力な型付き言語だからです。あるタイプを別のタイプに変更するには、最初にキャストする必要があります。

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

    /* ... */
}
于 2010-01-02T21:24:45.963 に答える
2

param ポインターを Character にキャストします。

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

参考までに、関数内で多くのものを呼び出す場合、すべての厄介な reinterpret_cast のものをどこでも保存できます

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

次に、「myCharacter->render();」を実行できます またはあなたは何を持っていますか...

于 2011-01-09T21:29:23.110 に答える