Включить файл беспорядок - PullRequest
       8

Включить файл беспорядок

3 голосов
/ 10 августа 2010

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

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

Ответы [ 4 ]

6 голосов
/ 10 августа 2010

component.h:

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

entity.h:

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

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

3 голосов
/ 10 августа 2010

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

Entity.h:

#include <vector>

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

Component.h:

#include <Entity.h>

class Component : public Entity { ... };

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

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.
2 голосов
/ 10 августа 2010
1 голос
/ 10 августа 2010

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

...