通常,将包含的对象声明为指向该类的指针,同时在头文件中“向前声明”它们。这是为了减少代码中的物理依赖性。

例如

class B;  // forward declaration

class A {
   private:
      B* pB;
};

将这样的成员声明为shared_ptr而不是裸指针是一个好主意吗?

我更喜欢scoped_ptr,但是AFAIK它不是标准的。

最佳答案

是的,您可以(应该吗?)。

这是一种常见的做法。如您所说,它避免了显式调用delete()的需要。

您可以走得更远。这是一个例子:

class RSAKey
{
  public:

    RSAKey();

  private:

    shared_ptr<RSA> d_rsa; // A pointer to a RSA structure from OpenSSL
}

我这样初始化:
RSAKey::RSAKey()
{
  RSA* rsa = RSA_generate_key(1024, 1, NULL, NULL);

  if (NULL == rsa) throw DummyException();

  d_rsa.reset(rsa, RSA_free); // Note the specific release method.
}

当不再使用d_rsa时,将自动调用RSA_free()。那不是很酷吗?

更新

如果选择C++11,则应该最好使用std::unique_ptr代替,因为它开销较小且可移动。

这取决于您希望封闭类在复制方面的表现。

10-08 08:49