通常将包含的对象声明为指向该类的指针,同时在头文件中“前向声明”它们。这是为了减少代码中的物理依赖性。
例如
class B; // forward declaration
class A {
private:
B* pB;
};
将这样的成员声明为 shared_ptr 而不是裸指针是个好主意吗?
我更喜欢 scoped_ptr,但 AFAIK 它不会是标准的。
通常将包含的对象声明为指向该类的指针,同时在头文件中“前向声明”它们。这是为了减少代码中的物理依赖性。
例如
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
开销较小且可移动的替代方案。
这取决于您希望封闭类在复制方面的行为方式。
如果这个指针没有从你的类实现中传递出去并且执行速度很重要,使用 scoped_ptr 而不是 shared_ptr。shared_ptr 有开销。
使用 ashared_ptr
将允许您将所有权传递给另一个对象,这样当您的外部对象被销毁时它就不会被销毁。您声明在这种特殊情况下这不会成为问题。
智能指针的唯一优势是您无需记住将 adelete pB
放入析构函数中。对于大多数人来说,这可能已经足够优势了。
当您不需要担心所有权问题时,即使是一个auto_ptr
就足够了。
在作文的情况下,是的,如果您不想要身体依赖,这是一个好主意。那么当 A 存在时,您的 B 将自动销毁。
如果您不介意物理依赖,则可以按值保存数据成员。
(如果物理依赖是一个问题,您还可以检查 pimpl 习惯用法。)