微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。