指针参考模式 - 常用吗?

时间:2011-07-08 22:04:44

标签: c++ oop design-patterns containers

在当前对象由其他包含对象操作的系统中,当传递对当前对象的引用时,看起来链接一直打开......没有任何结束(对于下面的代码,{{1} } ....)。

Car->myCurrentComponent->myCar_Brake->myCurrentComponent->myCar_Brake->myCurrentComponentCar引用相同的地址,指向相同的对象。这就像Car包含Brake,指的是Car。

实际上,Car是唯一的对象,myCar_Brake和myCar_Speed只是引用(指向)它。这种使用引用和指针是否正常?这种方法有任何潜在的问题吗?

  

示例代码

Car->myCurrentComponent->myCar_Brake

3 个答案:

答案 0 :(得分:5)

在对象图中使用循环引用没有任何根本问题,只要您理解并且不试图遍历对象图而不跟踪您遇到的对象。要专门回答你的问题,在对象之间进行循环引用是比较常见的;例如,它是双向链表的工作方式。

答案 1 :(得分:0)

尽管正如Paul所提到的那样,使用循环引用没有问题,但上面的代码示例完全缺少封装,并且内存泄漏不安全。

允许这样的事情是否有意义?

Speed::Speed(Car& value)
{
  myCar_Speed = value;
  // WTF code below
  value->myCurrentComponent->myCar_Brake = NULL;
}

另外,

Car::Car()
{
  myBrake = new Brake(*this);
  mySpeed = new Speed(*this);
  //if Speed::Speed(Car&) throws an exception, memory allocated for myBrake will leak
  myCurrentComponent = myBrake;
}

如果没有某种资源管理器,请不要使用原始指针。

答案 2 :(得分:0)

在没有讨论CarBreakSpeed关系的实际对象结构的有效性的情况下,这种方法有一个小问题:它可能处于无效状态。

如果 - 某事 - 出错了,在此设置中,Car实例#1可能有Break实例#2属于Car实例#3。双链表的一般问题 - 架构本身也会启用无效状态。当然,仔细的可见性修改器选择和良好的功能实现可以保证它不会发生。当它完成并且安全时,你停止修改它,把它当作一个“黑匣子”,然后使用它,从而消除了搞砸它的可能性。

但是,我个人建议避免使用允许高级别,不断维护的代码的无效状态的体系结构。双向链表是一个低级别的黑盒子代码,很可能不需要任何代码更改。你能说出你的CarBreakSpeed吗?

如果CarBreakSpeedBreakSpeed不知道他们的“拥有Car”,制造和无效的国家是不可能的。当然,它可能不适合具体情况。