在IT技术中,为了避免头文件之间的循环依赖或实现pimpl机制,使用前向声明是相当普遍的。因此,代码可能会像这样:
class A;
class B
{
A * a;
};
当尝试用unique_ptr替换它时:
class A;
class B
{
std::unique_ptr<A> a;
};
编译器报错了。解决这个问题的最佳实践是什么?
在IT技术中,为了避免头文件之间的循环依赖或实现pimpl机制,使用前向声明是相当普遍的。因此,代码可能会像这样:
class A;
class B
{
A * a;
};
当尝试用unique_ptr替换它时:
class A;
class B
{
std::unique_ptr<A> a;
};
编译器报错了。解决这个问题的最佳实践是什么?
需要在外层类B中声明析构函数,并在源文件中将其设置为默认值,以使unique_ptr不会强制内联其自己的默认删除器。
class B
{
public:
~B();
private:
std::unique_ptr<A> a;
};
在源文件中
#include <A.h>
... do stuff with ( a )
B::~B() = default;
std::unique_ptr<A>
之前,请确保已定义A
(而不仅仅是前向声明)。默认情况下,unique_ptr
使用运算符delete
(或其变体)释放对象,并且这需要使用基本的非类类型(int
、枚举、联合等)或调用struct
/class
类型的析构函数(如果只有该类的前向声明,则无法声明)。 - Peter