Вопрос

Я новичок в 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 (); ' или что есть ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top