Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理父/子类关系中的循环包含_C++_Circular Dependency - Fatal编程技术网

C++ 处理父/子类关系中的循环包含

C++ 处理父/子类关系中的循环包含,c++,circular-dependency,C++,Circular Dependency,假设我创建了一个类,比如说父类,它与子类有组合关系。父类包含子类的列表 我希望所有子级都持有对父级的引用,因此每个子级都持有一个parent指针 这将导致圆形夹杂物。我在parent.h中引用了Child,在Child.h中引用了parent。因此,父项需要包含子项,子项需要包含父项 解决这个问题的最佳方法是什么?由于子类中只存储了父类的指针,因此无需在子类中包含“Parent.h”。使用类父级的正向声明在child.h中,而不是在其中包含parent.h。在child的源文件,即child.c

假设我创建了一个类,比如说
父类
,它与
子类
有组合关系。父类包含子类的列表

我希望所有子级都持有对父级的引用,因此每个子级都持有一个
parent
指针

这将导致圆形夹杂物。我在parent.h中引用了
Child
,在Child.h中引用了
parent
。因此,
父项
需要包含
子项
,子项需要包含
父项


解决这个问题的最佳方法是什么?

由于
子类中只存储了
父类的指针,因此无需在
子类中包含“Parent.h”
。使用
类父级的正向声明
child.h
中,而不是在其中包含
parent.h
。在child的源文件,即
child.cpp
中,您可以执行
#包括“parent.h”
来使用
parent
方法。

您必须使用前向声明:

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

//child.h
class Parent; //Forward declaration
class Child
{
    Parent* m_parent;
};
//parent.h
班级儿童//远期申报
班级家长
{
向量m_儿童;
};
//child.h
班级家长//远期申报
班童
{
家长*m_家长;
};

为什么孩子们需要父指针?这可能是一个设计缺陷。子类也将在父类之外使用。使用孩子的代码一开始不知道他们被分配给哪位家长。由于没有看到代码,我想说约翰很有可能是对的,这是一个设计缺陷。@Pieter:我知道你已经接受了答案,可能继续你的生活,但你真的应该重新考虑你的设计。如果<代码>父< /代码> s需要知道<代码>子< /代码> s和<代码>子< /代码> s需要知道<代码>父< /C++ > s,那么有些东西是不对的,当它的修复难度比现在要高10倍时,它会再次困扰着你。不幸的是,除了教授和她的助手之外,我不允许与任何人讨论我的程序的设计或代码,所以我只能问一般的抽象问题。我想调查所谓的设计缺陷,但我不能透露有关我的代码的任何细节,因此我担心这是不可能的。我不建议使用
vector
a
vector
将意味着
父方
拥有
子方
ren,并将使内存管理更加容易。当然,仍然存在正确获取复制构造函数和赋值运算符的问题,因为应该更改
子项::m_父项
。父项可以拥有子项,即使它们被声明为
子项*
。当然,您必须为
父类提供正确的值语义。