C++: невозможно создать экземпляр указателя напрямую

Это проблема SDL, однако у меня есть сильное чувство, что проблема, с которой я столкнулся, связана не с SDL, а скорее с C++ / указателями в целом.

Короче говоря, этот код не работает (отредактирован, чтобы показать, что я действительно сделал):

player->picture = IMG_Load("player");
SDL_BlitSurface(player->picture, NULL, screen, &pictureLocation);

Я ничего не вижу на экране. Однако, когда я делаю это так, это работает:

SDL_Surface* picture = IMG_Load("player.png");
player->picture = picture;
SDL_BlitSurface(player->picture, NULL, screen, &pictureLocation);

Я вижу маленького парня просто отлично.

Реальная проблема в том, что я не могу создать экземпляр Player::picture напрямую. Даже когда я пытаюсь

picture = IMG_Load("player.png")

в player.cpp я получаю нулевой указатель.

3 ответа

Решение

Я так глуп. Получается, что я забыл расширение файла ".png" каждый раз, когда пытался сохранить поверхность в Player::picture, и не забывал добавлять его каждый раз, когда вставлял его в SDL_Surface, объявленный в main.cpp.

У меня было чувство, что я пропускаю что-то действительно простое, но это просто смущает. Какое подходящее наказание за это?

Вот почему вы всегда должны проверять, что возвращает IMG_Load()...

SDL_Surface* picture = IMG_Load("player.png");
if (picture == NULL) {
  // there was obviously some sort of error.
  // what does SDL_GetError() say?
}

Некоторые функции SDL возвращают -1, если есть ошибка. Просто проверьте документацию и убедитесь, что вы проверяете, возвращаются ли ваши функции. Эти шаги значительно упрощают отладку.

Какой тип данных игрок-> изображение? Какой тип возвращает IMG_Load? Сложно придумать сценарий, в котором сохранение выражения во временной переменной меняет результат, если не требуется преобразование типа.

И я бы не назвал этот указатель экземпляром. Вы создаете экземпляр некоторого типа изображения и сохраняете указатель на него.

Другие вопросы по тегам