1

与上一个问题有关,我现在有以下问题:

在接下来的风景中:

class B;

class A
{
   // stuff, methods and so on
   B b;
};

class B
{
   // stuff, methods and so on
   A a;
};

这里我们在A和之间有一个循环依赖B,但是这段代码格式不正确,因为B它是一个不完整的类型。一种解决方案是B通过指针或B例如通过智能指针进行更改。但是添加指针会增加复杂性和不必要的资源消耗,因为您不需要指针!

在上一个问题中,我试图通过模板避免使用指针,所以我在定义两个类的地方延迟了类的实例化,但我无法成功。

避免指针是不可能的吗?是否有众所周知的设计来避免循环依赖?

4

3 回答 3

8

避免某种形式的引用是不可能的,例如指针。

当您尝试这样做时,定义中有无限递归。AnA包括 aB其中包括 and A,以此类推。因此,这两个类都需要无限存储,这显然是荒谬的。

如果你真的有一个A包含BB包含的模型,A那么这些类似乎无法相互独立。在这种情况下,也许你真的只有一门课而不是两门课。

于 2013-04-11T17:05:56.170 回答
7

编译器必须计算出B.

它是如何做到的?计算出所需的空间是A.

但是 a 的大小A就是 a 的大小B。回到第一方,编译器必须永远循环才能弄清楚。因此它不编译。

唯一的解决方案是打破这个循环,即使用指针(智能或其他)。

于 2013-04-11T17:07:55.807 回答
3

我认为这主要不是编译器的问题(尽管它不能这样做),而是您的设计中的问题:数据成员表示所有权。如果A有类型的数据成员B,则 的实例A拥有 的实例B

如果同样适用B,那么您将获得循环所有权(a拥有bb拥有a)或无限系列的a0拥有b0拥有a1拥有b1......

因此,您必须为实例不拥有另一种类型的实例的两种类型中的至少一种表示。您可以在 C++ 中使用(智能)指针或引用来执行此操作,或者将对象传递给需要它的类的每个成员函数。

于 2013-04-11T17:21:11.833 回答