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? Сложно придумать сценарий, в котором сохранение выражения во временной переменной меняет результат, если не требуется преобразование типа.
И я бы не назвал этот указатель экземпляром. Вы создаете экземпляр некоторого типа изображения и сохраняете указатель на него.