在当前对象由其他包含对象操作的系统中,当传递对当前对象的引用时,看起来链接一直打开......没有任何结束(对于下面的代码,{{1} } ....)。
我Car->myCurrentComponent->myCar_Brake->myCurrentComponent->myCar_Brake->myCurrentComponent
和Car
引用相同的地址,指向相同的对象。这就像Car包含Brake,指的是Car。
实际上,Car是唯一的对象,myCar_Brake和myCar_Speed只是引用(指向)它。这种使用引用和指针是否正常?这种方法有任何潜在的问题吗?
示例代码
Car->myCurrentComponent->myCar_Brake
答案 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)
在没有讨论Car
,Break
和Speed
关系的实际对象结构的有效性的情况下,这种方法有一个小问题:它可能处于无效状态。
如果 - 某事 - 出错了,在此设置中,Car
实例#1可能有Break
实例#2属于Car
实例#3。双链表的一般问题 - 架构本身也会启用无效状态。当然,仔细的可见性修改器选择和良好的功能实现可以保证它不会发生。当它完成并且安全时,你停止修改它,把它当作一个“黑匣子”,然后使用它,从而消除了搞砸它的可能性。
但是,我个人建议避免使用允许高级别,不断维护的代码的无效状态的体系结构。双向链表是一个低级别的黑盒子代码,很可能不需要任何代码更改。你能说出你的Car
,Break
和Speed
吗?
如果Car
有Break
和Speed
,Break
和Speed
不知道他们的“拥有Car
”,制造和无效的国家是不可能的。当然,它可能不适合具体情况。