0

这可能被视为一个风格问题。我有一个类,它保留对另一个类的实例的引用:

class A { };

class B {
  A& ref;

public:
  explicit B(A& ref) : A(ref) { }
};

我决定使用引用而不是指针,因为 ref 永远不可能是空指针。此外,代码看起来更好。

但是,用户不知道我是否复制了 A 对吗?在这种情况下,我不复制,所以如果 A 在 B 的实例仍然存在的情况下被销毁,就会出现问题。如果您使用指针,那么当然会发生同样的情况,但我觉得用户在编写代码时会意识到没有进行复制。

对此有何看法?处理这个问题的最佳 C++ 方法是什么?

PS.:我想到的一个解决方案是制作一些东西以便保留一个指针,但是如果它指向的对象被销毁,那么首先制作一个副本。这并不难实现,但关键是:额外的麻烦是否值得,开销是否合理?这种自制的参考计数器真的是人们会做的吗?

4

4 回答 4

3

如果B必须只使用一个实例A并且该实例永远不会改变,那么引用是有意义的。因此,B不能在没有实例的情况下构造A- 你引入了紧耦合。

但是,如果您可以拥有B独立于的实例A,则将其设为指针 - 这将允许您A稍后根据需要设置的实例。无论哪种方式,您都必须保证A; 避免这种情况(生命周期控制)的唯一方法是使用智能指针来管理A.

于 2013-05-21T10:03:25.133 回答
1

我有一个类,它保留对另一个类的实例的引用:

因为你的类没有私有赋值运算符,它应该是可复制和可赋值的,所以要么你的决定是一个错误(你应该使用指针),要么你的类声明不完整。另见三法则

如果您的类将有赋值运算符 ( operator=),则必须使用指针或某种智能指针(如std::weak_ptr)。

一般来说,使用以下规则是有意义的:

  1. 在函数参数中,如果参数是“大”或具有昂贵的复制构造函数,请使用引用或指针。
  2. 如果该参数是可选的并且可以是 0/NULL/null_ptr,则使用指针,否则使用引用。
  3. 对于“指向”某物的局部变量,请使用引用,除非该变量的值可以更改。
  4. 当您需要指向“某物”并且必须使用指针时,如果您不管理该对象的生命周期,请使用标准指针,否则使用智能指针(std::shared_ptr等等)。
  5. 你永远不应该给delete自己打电话,除非你的代码受到限制并且你必须避免同时使用 stl 和 boost 。内存管理应尽可能自动执行。这减少了出错的机会。
  6. 在类成员中,仅当无法以任何方式复制该类(例如,单例)时才使用引用。
于 2013-05-21T10:54:16.650 回答
0

一般来说,它是完全一样的,有指针和引用......

您是说可以删除 B 中引用的对象 A,因此拥有没有 A 引用对象的 B 对象是有效的。你不能用引用来做这个,你需要空指针->使用指针,而不是引用

于 2013-05-21T09:58:53.673 回答
0

这是我个人的规则——不持久的函数参数的参考,持久的东西的指针。然后,如果用户通过指针,他需要仔细查看寿命。另外,如果你想复制 B 会发生什么?如果它是一个参考,你不能再改变它。

于 2013-05-21T10:09:31.027 回答