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
avector
将意味着父方
拥有子方
ren,并将使内存管理更加容易。当然,仍然存在正确获取复制构造函数和赋值运算符的问题,因为应该更改子项::m_父项
。父项可以拥有子项,即使它们被声明为子项*
。当然,您必须为父类提供正确的值语义。