2010-08-10 2 views
3

У меня есть 2 класса - один холдинг Информация об объекте другой холдинг Информация о компоненте. Теперь проблема в том, что классу Entity требуется класс Component, уже определенный для его использования в векторе дочерних элементов, но в то же время компоненту требуется Entity, чтобы объявить его как родителя (я держу все связанное между ними). Это вызывает странные ошибки, хотя IntelliSense говорит, что все это уже определено.Включить файл беспорядок

Как я могу преодолеть эту трудность?

ответ

6

component.h:

class Entity; 
class Component { 
    ... 
    Entity *parent; 
}; 

entity.h:

#include "component.h" 
class Entity { 
    ... 
} 

Единственным недостатком здесь является то, что методы встроенные в component.h не могут использовать методы сущностей.

+0

Это сработало спасибо! На всякий случай, я хотел бы видеть, есть ли способ использовать методы _and_ use. Какие-нибудь советы? – Johnny

+0

Вы можете использовать методы в файле .cpp, а не в заголовке. –

+0

В классе Component, которые вызывают методы Entity, вы можете иметь методы, вы просто не можете их встроить в файл .h. Вы должны добавить прототип для них в классе, а затем реализовать его в файле component.cpp (который включает в себя как component.h, так и entity.h). –

3

Похоже, у вас есть это:

Entity.h:

#include <vector> 

class Entity { 
public: 
    std::vector<Component> children; 
}; 

Component.h:

#include <Entity.h> 

class Component : public Entity { ... }; 

Один из способов обойти эту проблему заключается в вперед-объявить класс Component и использовать vector указатели на Component с:

Entity.h:

#ifndef ENTITY_H 
#define ENTITY_H 
#include <vector> 

class Component; // Forward declaration. 

class Entity { 
public: 
    std::vector<Component*> children; 
}; 

#endif /* ndef ENTITY_H */ 

Component.h:

#ifndef COMPONENT_H 
#define COMPONENT_H 
#include <Entity.h> // To allow inheritance. 

class Component : public Entity { ... }; 

#endif /* ndef COMPONENT_H */ 

Entity.cpp:

#include <Entity.h> 
#include <Component.h> // To access Component members. 
+0

Aaah, вы советуете поместить его в файл cpp и сделать объявление в заголовке? Благодаря! Это, скорее всего, то, что мне нужно! Все еще меня беспокоит, вы включили Entity.h, тогда вы включаете Component.h, не будет ли это включать Entity в два раза? Может быть, я могу использовать определение для игнорирования, включая Entity в compoenent.h? – Johnny

+0

Я опускал включенных охранников для краткости, потому что они довольно распространенная практика. Я поставлю их для полноты. –

1

Один из вариантов, если вы просто использовать указатели до Component в вашем vector (т.е. vector<Component*> (или умный ptr va riant) вместо vector<Component>), вы можете перенаправить объявление класса Component и объявление класса Entity не нуждается в определении Component.

+0

Я использую вектор , но это не решает его, так как мне нужен этот ptr из объекта, назначаемого pParent в объекте Copmonent. – Johnny

+0

Вы пишете весь код в файлах заголовков? Обычно вы хотите делать объявления в файле заголовка. Если перед вашим определением 'Entity' вы пересылаете declare (' Class Component; '), вам не нужно включать' Component.h' в ваш файл заголовка. Он понадобится вам в исходном файле, когда вы фактически инициализируете/используете свой объект 'Component', но в том числе' Component.h' из 'Entity.cpp' не вводит циклическую ссылку. – bshields

+0

Конечно, нет, заголовок предназначен только для определений. Однако я понял это - я включаю их в исходные файлы, а использование #ifndef включает защиту (вы знаете, что я имею в виду). – Johnny