如何使用前向声明类型的unique_ptr

How to use unique_ptr with forward declared type?

本文关键字:unique ptr 类型 声明 何使用      更新时间:2023-10-16

为了避免循环头文件依赖或实现pimpl而使用前向声明是很常见的,那么最终可能会出现如下代码:

class A;
class B
{
  A * a;
};

当试图用unique_ptr:

替换它时
class A;
class B
{
  std::unique_ptr<A> a;
};

编译器报错。让它工作的最佳实践是什么?

需要声明封闭类B的析构函数,并在源文件中将其设置为default,这样unique_ptr就不会强制内联它自己的默认删除器。

class B
{
  public:
  ~B();
  private:
  std::unique_ptr<A> a;
};

和源文件

#include <A.h>
... do stuff with ( a )
B::~B() = default;

应该做这项工作。