C++ / SDL 'void*' не является типом типа Точка-объект


Я новичок в C++, и я пытаюсь сделать некоторые тесты с C++ и SDL, и в SDL у нас есть функция:

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

Который я могу передать обратный вызов для созданного таймера. Но, по-видимому, он преобразует мой экземпляр this в * void, поэтому я не могу получить его снова в методе update, который является статическим, и это интересно, но SDL_AddTime не работает на нестатической функции обратного вызова.

Итак, моя проблема заключается в том, что при попытке вызвать открытый метод render через void * param аргумент он жалуется на то, что не является указателем на тип объекта...

Есть ли способ, которым я могу получить экземпляр символа снова внутри метода update, так как у меня нет контроля над функцией SDL_AddTime, и я должен передать необходимые параметры?

Спасибо

#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 2

4 ответа:

Вам не нужно reinterpret_cast-static_cast должен быть в порядке:

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

Вам следует избегать reinterpret_cast - он почти всегда специфичен для реализации и может скрывать проблемы-точно так же, как старые c-касты.

Приведите указатель param к символу:

Character * charPtr = reinterpret_cast<Character *>(param);
charPtr->render();

Причина в том, что C++ - это сильный типизированный язык. Чтобы изменить один тип на другой, вам нужно сначала привести его:

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

    /* ... */
}

Просто для справки, если вы должны были вызвать много вещей в функции, чтобы сохранить все неприятные reinterpret_cast вещи везде, где вы можете сделать

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

Который затем позволяет вам сделать 'myCharacter - > render ();' или whathaveyou...