以下是否表示设计不良?

时间:2010-06-05 18:45:38

标签: c++ class dependencies

我想知道你是否认为以下代码通常表明设计不好......

class X
{
public:
  ...
private:
  Y y;
};

Class Y
{
public:
   Y( X& value ){ x = value; };
private:
   X& x;
}

(即类X和Y之间存在某种循环依赖关系)。

5 个答案:

答案 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)

这不一定是糟糕的设计,实际上它是相当普遍的。但是,在处理内存管理时,您需要非常小心这些设计。当每个类依赖于另一个类时,你最终会遇到棘手的错误。