2014-02-13 2 views
1

Я работаю над своей первой нетривиальной игрой на C++, и я сражаюсь с причудливыми гейзенбергами и такими вот уже несколько дней. Для меня это совсем не весело, потому что это не логично. (По крайней мере, не для меня, поскольку я не совсем хардкор, когда речь заходит о более эзотерическом, низкоуровневом материале.) Это очень неприятно, потому что некоторые из ошибок могут быть «исправлены», помещая произвольные вызовы window.draw() или std::cout. Я думал, что проблема связана с обманчивыми указателями, и это все еще может быть, но я думаю, что я их расчистил. Прямо сейчас проблема заключается в том, что сущности считают, что они могут умереть, когда касаюсь моей мыши до верхней части экрана, несмотря на отсутствие кода, который говорит им об этом. (На самом деле, код удаленно не связан с положением мыши и y = 0.) В любом случае ...Я случайно использую полиморфизм для (потенциально) рекурсивного определения класса?

Я думаю, что я сузил проблему (или хотя бы одну проблему) до одной строки кода, а я думаю, я могу исправить ошибку, немного изменив архитектуру. Но я хочу, чтобы это было учебным опытом, и я не знаю, почему это происходит. Вот что я думаю, продолжается.

У меня есть суперкласс класса GameEntity с подклассом Soldier, который также является Launcher (который наследуется от ничего). Я думаю, что это множественное наследование является частью проблемы, потому что класс Launcher имеет метод запуска с параметрами GameEntity. Как таковой, я думаю, что можно было бы рекурсивно назвать метод запуска, если GameEntity, переданный методу , - это запуска. Я просто понял, что это, вероятно, происходит в какой-то момент, поскольку игра замерзает в методе запуска. В принципе, я хочу знать, является ли этот потенциал для рекурсии из-за полиморфизма и множественного наследования причиной странных проблем и почему. Пока я не знаю, что я делаю, я буду гораздо более консервативным с полиморфизмом и указателями.

Действительно, любые предложения были бы очень полезны. Благодаря!

+0

Использует ли ваш код 'delete' или' free'? Затем исправьте его. Использует ли он 'new'? Затем дважды проверьте, что вы понимаете время жизни объекта. Затем используйте отладчик памяти, например 'valgrind', и убедитесь, что ваш код не вызывает ошибок. –

+0

Множество новых, но все динамически выделяемое попадает в вектор, где его можно удалить. Кроме того, утечек памяти нет. – ICoffeeConsumer

+0

Опубликовать объявление о классах, которые вы упомянули – bolov

ответ

0

Похоже, у вас есть проблема с четким определением ответственности и сотрудничества ваших классов. Варианты наследования должны следовать из этих отношений, найденных в дизайне.

Вы можете добавить поле для целей отладки, launchable и проверить, что ваш запускает только то, что можно запустить. Также убедитесь, что сами объекты Launcher не запускаются. Как побочный эффект, это не позволяет вам запускать себя.