这可能被视为一种风格问题。我有一个类来保持对另一个类的实例的引用:
class A { };
class B {
A& ref;
public:
explicit B(A& ref) : A(ref) { }
};
我决定使用引用而不是指针,因为ref永远不会是空指针。此外,代码看起来更好。
但是,用户不知道我是否复制A对吗?在这种情况下,我不复制,因此如果在B的实例仍然存在时销毁A,则会发生问题。如果你使用指针,那么当然也会发生同样的情况,但我觉得用户在编写代码时就会意识到没有进行复制。
对此有何看法?处理这个问题的最佳C ++方法是什么?
PS:我想到的一个解决方案就是保持指针,但是如果它指向的对象被破坏,那么首先要复制一个。这不是那么难以实现,但重点是:额外的麻烦是否值得,并且开销是否合理呢?这种自制的参考计数器是人们真正做的吗?
答案 0 :(得分:3)
如果B
必须只使用A
的单个实例且该实例永远不会更改,则引用才有意义。因此,如果没有B
的实例,则无法构造A
- 您引入了紧耦合。
但是,如果您可以使B
的实例独立于A
,则将其设为指针 - 这将允许您根据需要稍后设置A
的实例。无论如何,你必须保证A
的生命周期;避免这种情况(生命时间控制)的唯一方法是使用智能指针来管理A
的生命周期。
答案 1 :(得分:1)
我有一个类来保持对另一个类的实例的引用:
因为你的类没有私有赋值运算符,所以它应该是可复制的和可分配的,所以你的决定是错误的(你应该使用指针),或者你的类声明是不完整的。另请参阅rule of three。
如果你的类要有赋值运算符(operator=
),你将不得不使用指针或某种智能指针(如std::weak_ptr
)。
通常,使用以下规则是有意义的:
std::shared_ptr
等)。 delete
,并且必须避免同时使用stl和boost。应尽可能以自动方式执行内存管理。这减少了错误的机会。 答案 2 :(得分:0)
一般来说,它与指针和引用完全相同......
您说可以删除B中引用的对象A,因此有一个没有A引用对象的B对象是有效的。你不能用引用做这个,你需要空指针 - >使用指针,而不是引用
答案 3 :(得分:0)
这是我的个人规则 - 对于不会持久存在的函数参数的引用,指出持续存在的事物。然后,如果用户通过指针,他需要仔细观察生命周期。另外,如果你想复制B&B,会发生什么?如果它是参考,您将无法再进行更改。