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



我有一个带有前向声明类的头,我想在其中声明一些智能指针成员。然而,由于智能指针模板类型在声明时在技术上是不完整的,我收到了关于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;

相关内容

  • 没有找到相关文章

最新更新