在头文件中“前向声明”该类的指针作为其包含对象是很常见的做法,这样可以降低代码的物理依赖性。
例如:
class B; // forward declaration
class A {
private:
B* pB;
};
声明这样的成员为shared_ptr,而不是裸指针,会是一个好主意吗?
我更喜欢scoped_ptr,但据我所知,它不会成为标准。
在头文件中“前向声明”该类的指针作为其包含对象是很常见的做法,这样可以降低代码的物理依赖性。
例如:
class B; // forward declaration
class A {
private:
B* pB;
};
声明这样的成员为shared_ptr,而不是裸指针,会是一个好主意吗?
我更喜欢scoped_ptr,但据我所知,它不会成为标准。
是的,你可以(应该?)这样做。
这是一种常见的做法。正如你所说,它避免了需要显式调用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.
}
如果这个指针不会传递出你的类实现,而且执行速度很重要,那么使用scoped_ptr而不是shared_ptr。shared_ptr有额外的开销。
unique_ptr
是C++版本的智能指针,它也支持移动语义。 - Johannes Schaub - litb使用 shared_ptr
可以让您将所有权传递给另一个对象,这样当您的外部对象被销毁时,它不会被销毁。您表示在这种情况下这不会成为一个问题。
智能指针唯一的好处就是您无需记得在析构函数中放置 delete pB
。对于大多数人来说,这可能已经足够优点了。
当您不需要担心所有权问题时,即使是 auto_ptr
也足够好。
如果涉及到组合,如果您不想要物理依赖,那么这是一个好主意。这样当A被销毁时,B也会自动被销毁。
如果您不介意物理依赖,可以直接按值持有数据成员。
(如果物理依赖是一个问题,您还可以检查pimpl习惯用法。)