Работа с циклическим включением в родительские / дочерние классовые отношения - PullRequest
4 голосов
/ 15 ноября 2010

Предположим, я создал класс, скажем, Parent, который имеет композиционное отношение с Child.Родительский класс содержит список дочерних элементов.

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

Это приведет к циклическому включению.Я ссылаюсь на Child в parent.h и ссылаюсь на Parent в child.h .Следовательно, Parent должен будет включать Child, который должен включать Parent.

Какой лучший способ обойти это?

Ответы [ 2 ]

8 голосов
/ 15 ноября 2010

Вы должны будете использовать предварительную декларацию:

//parent.h
class Child; //Forward declaration
class Parent
{
    vector<Child*> m_children;
};

//child.h
class Parent; //Forward declaration
class Child
{
    Parent* m_parent;
};
3 голосов
/ 15 ноября 2010

Поскольку в классе Child хранится только указатель Parent, нет необходимости делать #include "parent.h" в файле child.h.Используйте предварительное объявление class Parent; в child.h вместо включения parent.h там.В исходном файле потомка, т.е. child.cpp, вы можете сделать #include "parent.h", чтобы использовать методы Parent.

...