C ++/sdl 'void*' не является типом точки к объекту
Вопрос
Я новичок в C ++, и я пытаюсь провести некоторое тестирование с C ++ и SDL, а в SDL у нас есть функция:
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param);
который я могу передать обратный вызов для созданного таймера. Но, очевидно, это преобразует мой экземпляр в это в void, поэтому я не могу снова получить его в методе обновления, который является статичным, и это интересно, но SDL_ADDTIME не работает на не статической функции обратного вызова.
Что ж, поэтому моя проблема заключается в том, что при попытке вызвать публичный метод визуализирован через аргумент void* param, он жалуется на то, что он не является типом указателя к объекту ...
Есть ли способ, которым я могу снова получить экземпляр символа в методе обновления, так как у меня нет управления функцией 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");
}
Решение
Вам не нужен переосмысление overtepret_cast - static_cast должен быть в порядке:
Character * cp = static_cast <Character *>( param );
Вы должны избегать переосмысления overpret_cast - это почти всегда конкретно реализует, и может скрывать проблемы - точно так же, как Casts старого стиля.
Другие советы
Отправьте указатель 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 (); ' или что есть ...