作为类成员

时间:2016-04-28 18:58:01

标签: c++

让我们说我有以下课程:

class BigClass
{
public:
    BigClass();
    ~BigClass();

private:
    ... // many variables
};

另一堂课:

class SmallClass
{
public:
    SmallClass();
    ~SmallClass();

private:
    const BigClass &ref;
};

请注意,我引用了一个名为BigClass的{​​{1}}对象。

  • 这是一个好设计吗?有没有更好的方法呢?
  • 当实际的ref对象超出范围时会发生什么?它会被删除还是因为BigClass引用它而保持活着?如果它被删除,那么保持活着的一个好方法是使用ref而不是引用吗?

1 个答案:

答案 0 :(得分:3)

  

这是一个好设计吗?有没有更好的方法呢?

如果确保SmallClass的寿命比BigClass短,那么它就完全没问题了。这种事情经常出现在用作“仿函数”的小类中。

否则使用智能指针:唯一或共享。或弱共享。

  

当实际的BigClass对象超出范围时会发生什么?

如果SmallClass仍然存在且具有引用,则它现在是无效引用,并且您的程序将具有未定义的行为。那很糟。它可能不会崩溃,但使用引用将写入另一个对象或破坏堆的可用内存跟踪,或覆盖堆栈值,包括可能的函数返回地址。

  

它会被删除还是因为引用它而保持活着?

这不是Java。它将被删除。如果您需要跟踪引用计数,那么您需要一个共享的智能指针。

  

如果它被删除,那么保持活着的一个好方法是使用shared_ptr而不是引用吗?