如何使用unique_ptr与前置声明类型?

3

在IT技术中,为了避免头文件之间的循环依赖或实现pimpl机制,使用前向声明是相当普遍的。因此,代码可能会像这样:

class A;

class B
{
  A * a;
};

当尝试用unique_ptr替换它时:

class A;

class B
{
  std::unique_ptr<A> a;
};

编译器报错了。解决这个问题的最佳实践是什么?


5
你读过https://dev59.com/bm025IYBdhLWcg3wbVan 吗? - m.s.
在声明std::unique_ptr<A>之前,请确保已定义A(而不仅仅是前向声明)。默认情况下,unique_ptr使用运算符delete(或其变体)释放对象,并且这需要使用基本的非类类型(int、枚举、联合等)或调用struct/class类型的析构函数(如果只有该类的前向声明,则无法声明)。 - Peter
只需在已知完整类型时定义需要知道的所有内容。http://coliru.stacked-crooked.com/a/92407ffd3e333a97 - Baum mit Augen
@m.s. 那个问题有点复杂。我正在寻找一些简单明了的东西。 - g24l
1个回答

2

需要在外层类B中声明析构函数,并在源文件中将其设置为默认值,以使unique_ptr不会强制内联其自己的默认删除器。

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

在源文件中

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

应该可以完成这个任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接