VS C ++ 2010 Express проблемы (IDE / файлы заголовка АД?) - PullRequest
2 голосов
/ 13 февраля 2011

Я почти закончил писать первый черновик логического движка моей игры, который основан на сущностях / компонентах.Это не совсем основано на этой философии, но я также думаю, что способ реализации отличается от человека к человеку.Я пишу на C ++, используя ООП, STL и виртуальные функции.Да, я знаю, что виртуальные функции могут быть медленными, но это не упражнение для выполнения чего-то очень быстрого, просто логический движок, который может быть легко расширен и понятен другим (все также комментируется).Это всего лишь упражнение в «разработке программного обеспечения» новичка в разработке игр, если вы хотите так его назвать.

Мой первый черновик почти завершен, основные сервисы (различные inits, directX и т. Д.)отделены от игровой логики и готовы к использованию.Я просто пытаюсь закончить логический движок, прежде чем смогу создать свой первый прототип игры (я думаю об изометрической ARPG).Движок GL построен как дерево классов, начиная с базового абстрактного класса «Entity» и выводя из него все более и более конкретные классы.По причинам хорошего дизайна нигде не более 3 или 4 уровней наследования. Я думаю.

Но у меня может быть серьезная проблема: в некоторых классах, в которых я объявляю переменные-члены объектами другого класса,это происходит: после того, как IDE запускает и анализирует то, что я написал, он подчеркивает тип этой конкретной переменной-члена (имя класса) и говорит, что она нигде не объявлена.Затем, через долю секунды, красное подчеркивание исчезает, и оно говорит, что все в порядке и объявляется (oO), ЭТО СЛУЧАЕТСЯ СНОВА И СНОВА каждый раз, когда анализирует код.Это происходит также в другом классе с другим типом класса.Просто чтобы прояснить, я включил все соответствующие заголовки, и он ДОЛЖЕН знать об объявлении типа и где это делается.

Кроме того, если я пытаюсь скомпилировать, это дает мне gl_nonrenderableentity.h(21): error C2143: syntax error : missing ';' before '*' и gl_nonrenderableentity.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-intв парах для каждой ошибочной переменной.

Я знаю, что причина этого не в том, чтобы найти его тип где-либо (что странно, IDE находит, почти через секунду после каждого анализа).Иногда эти ошибки дублируются в выходных данных компилятора, и после небольшой настройки того, как заголовки включены, я получаю только одну копию на переменную (и это по-прежнему не имеет смысла, я использую include guard ... не VS2010 Express понимает прагмы?)

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

Каждый раз, когда у меня возникала проблема, я исследовал и обнаруживал исправление в своемсобственные, даже проблемы с IDE (знаменитая ошибка msbuild).Но я просто не могу понять это, и мне нужна помощь ветеранов.Кто-нибудь знает, почему IDE так реагирует?Исчезающее красное подчеркивание после каждого анализа IDE должно что-то значить.Я знаю, что это происходит с новыми переменными, когда вы пишете, пока IDE не найдет их объявления, но это только один раз, и тогда это нормально, несмотря ни на что .. с этими двумя конкретными классами, это всегда делает снова и снова это (и это единственныевозникла эта проблема).Другие переменные-члены из других классов не имеют этой проблемы.

Спасибо.Извините за длинный пост, но я старался изо всех сил объясниться.Если кому-то нужна дополнительная информация, пожалуйста ..

решено

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

1 Ответ

0 голосов
/ 13 февраля 2011

Единственная причина, по которой я могу придумать, это циклическая ссылка, и хотя это может быть неочевидно сразу, простой способ проверить (и, возможно, исправить) это добавить предварительное объявление для другого класса:

class NonRenderableEntity;

class Action:public NonRenderableObject
{
    ...
    NonRenderableEntity *userEntity;
    ...
};

Кроме того, не воспринимайте проверку IntelliSense (красные подчеркивания) слишком серьезно - она ​​не идеальна и может запутаться, особенно со сложными ссылками, такими как эта.

Обновление: Циркулярные ссылки не вызовут проблем, если вы используете только указатели на объекты.Поскольку размер указателя не зависит от реального объекта, компилятор может выделить указатель заранее без проблем.В таких языках, как C #, объектами всегда манипулируют с помощью ссылок (указателей), поэтому проблема не возникает.

...