我想知道你是否认为以下代码通常表明设计不好......
class X
{
public:
...
private:
Y y;
};
Class Y
{
public:
Y( X& value ){ x = value; };
private:
X& x;
}
(即类X和Y之间存在某种循环依赖关系)。
答案 0 :(得分:7)
取决于你想要做什么。某些设计(如迭代器)需要这些类型的循环。
答案 1 :(得分:4)
不,我不认为这是糟糕的设计。它看起来像父子关系(1对1),其中孩子的指针指向父母。
这种设计的主要原因是,有人可以在不通过Y
的情况下获得对X
的引用。如果Y
的所有访问权限仅通过X
完成,则此类引用更有问题。
正如Billy ONeal所指出的,一个例子可能是一个需要能够引用它所属的集合的迭代器。这可以使迭代器成为一个数组,在调整数组大小时不需要使其无效,因为它会在每次访问时检查数组的当前缓冲区地址和当前大小。
另一个示例可能是OrderLine
类(您的X
),其中包含对项目的引用和数量计数等。它还有一个DigitalLicense
类型的可选成员(您的Y
DigitalLicense
)。 OrderLines
包含许可证的大型加密说明,因此它仅包含在与具有数字许可证的产品对应的DigitalLicense
中。
在构造时,对DigitalLicense
的引用也放在一个单独的地图中,以许可证ID为中心。现在可以根据地图中的许可证ID查找DigitalLicense
。然后使用后向引用从OrderLine
转到OrderLine
。如果Order
具有类似的后退引用,则也可以返回{{1}}。
答案 2 :(得分:2)
例如在VB6中,这是糟糕的设计,因为VB无法删除两个对象,其中一个在另一个对象中引用,反之亦然。因为C ++没有引用计数,所以不再有问题了。
答案 3 :(得分:1)
我不认为这是有问题的。实际上,它是一种相当常见的模式(即子对象维护对父对象的指针/引用)。
答案 4 :(得分:1)
这不一定是糟糕的设计,实际上它是相当普遍的。但是,在处理内存管理时,您需要非常小心这些设计。当每个类依赖于另一个类时,你最终会遇到棘手的错误。