Другой «х не был объявлен в этой области» - PullRequest
2 голосов
/ 25 июля 2010

это мой первый вопрос здесь.

При написании кода я получаю эту ошибку от g ++: «Объект не был объявлен в этой области», в этом контексте:

#ifndef Psyco2D_GameManager_
#define Psyco2D_GameManager_

#include <vector>
#include "Entity.h"

namespace Psyco2D{
    class GameManager{J
    private:
        std::vector<Entity> entities;
    };
}

#endif

Это содержимое Entity.h:

#ifndef Psyco2D_Entity_
#define Psyco2D_Entity_

#include <string>
#include "GameManager.h"
#include "EntityComponent.h"


namespace Psyco2D{

    class Entity{
        friend class GameManager;

    private:
        /* Identificatore */
        std::string _name;

        /* Components list */
        std::map<const std::string, EntityComponent*> components;

    protected:
        Entity(const std::string name);

    public:
        inline const std::string getName() const{
            return this->_name;
        }

        void addComponent(EntityComponent* component, const std::string name);

        EntityComponent* lookupComponent(const std::string name) const;

        void deleteComponent(const std::string name);

    };

}

#endif

Если я использую std::vector<class Entity> вместо std::vector<Entity>, это работает.

Почему?

Спасибо всем =)

Ответы [ 3 ]

7 голосов
/ 25 июля 2010

Проблема в том, что у вас есть циклическая зависимость.Извлеките #include "GameManager.h" в Entity.h, поскольку в этом заголовке это не нужно.(Голосование с повышением этот ответ , который первым указал на него.)

Обратите внимание, что проблема заключается в охранниках;но не вынимай их!Вам просто нужно минимизировать количество включений, которые у вас есть, и объявлять (а не определять) типы, когда это возможно.Рассмотрим, что происходит, когда вы включаете Entity.h: в качестве некоторого пункта он включает GameManager.h, что, в свою очередь, включает Entity.h.На этом этапе у Entity.h уже определена защита заголовка, поэтому он пропускает содержимое.Затем анализ GameManager.h продолжается, после чего он сталкивается с Entity и справедливо жалуется, что он не определен.(Действительно, это все еще процесс включения GameManager.h в первое включение Entity.h, задолго до того, как определен Entity!)

Обратите внимание, что ваши многочисленные правки демонстрируют, почему важно размещать реальный код,не повторно синтезированный код.Вам нужны реальные данные, чтобы получить реальные ответы.


Старый:

Entity находится в пространстве имен Psyco2D.Вам необходимо указать, что:

class GameManager{
private:
    std::vector<Psyco2D::Entity> entities;
};
4 голосов
/ 25 июля 2010

Предполагая, что первый фрагмент является частью GameManager.h, у вас есть круговая зависимость заголовка. Я полагаю, что вы можете это исправить, изменив GameManager.h include в Entity.h на class GameManager;.

Кроме того, как отметил GMan, Entity находится в пространстве имен, и вам необходимо указать Entity с именем пространства имен.

0 голосов
/ 25 июля 2010

Удалите пространство имен Psyco2D, и оно будет работать без объявления "класса Entity".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...