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 ответа:
Вам не нужно 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...