如何在带有不完整的前向声明类的头文件中声明智能指针?

问题描述

我有一个带有前向声明类的标头,我想在其中声明一些智能指针成员。但是,由于智能指针模板类型在声明时在技术上是不完整的,因此我收到有关sizeof无法执行的编译错误用于唯一指针。我是否必须将实现标头放入类的标头中,而不是前向声明它们,还是可以向我的前向声明提供一个满足智能指针的附加存根?

例如,这是头文件

#include <memory>

namespace N {
    class A;
    class Owner {
        std::unique_ptr<A> myMember;
    }
}

这是源文件

#include "A.H"

class Owner{
    Owner() {
        myMember = std::make_unique<A>("arg1","arg2");
    }
}

我宁愿不向包含头文件的所有人提供依赖关系,这就是为什么在我使用原始指针时最初对类进行前向声明的原因。

解决方法

如何在带有不完整的前向声明类的头文件中声明智能指针?

通过定义构造函数,析构函数和其他函数,这些函数依赖于标题外部和单独的转换单元中的指向的类的完整定义。

我是否必须将实现标头插入类的标头中

不。仅当您没有如我所描述的那样在类定义之外定义成员函数时,这才是必需的。


示例:

struct Owner {
    std::unique_ptr<A> myMember;

    Owner();
    ~Owner();
    Owner(Owner&&);
    Owner& operator=(Owner&&);
};

class A {};

Owner::Owner() = default;
Owner::~Owner() = default;
Owner::Owner(Owner&&) = default;
Owner& Owner::operator=(Owner&&) = default;