【问题标题】:How to use unique_ptr with forward declared type? [duplicate]如何使用具有前向声明类型的 unique_ptr? [复制]
【发布时间】:2016-01-17 16:45:06
【问题描述】:

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

class A;

class B
{
  A * a;
};

当尝试用 unique_ptr 替换它时:

class A;

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

编译器抱怨。实现此功能的最佳做法是什么?

【问题讨论】:

  • 确保在声明 std::unique_ptr&lt;A&gt; 之前已定义 A(而不仅仅是前向声明)。默认情况下,unique_ptr 使用运算符 delete(或变体)来释放对象,这需要使用基本的非类类型(int、枚举、联合等)或调用 @ 的析构函数987654330@/class 类型(仅使用类的前向声明不会声明)。
  • 只要定义所有需要知道完整类型的东西。 coliru.stacked-crooked.com/a/92407ffd3e333a97
  • @m.s.好吧,这个问题有点令人费解。我正在寻找简单的东西

标签: c++ unique-ptr


【解决方案1】:

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

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

在源文件中

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

应该做的工作。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多