Pimpl with unique_ptr:为什么我必须将接口的构造函数定义移至“ .cpp”?

javaLover

只要我不将构造函数(of B的定义移到标头,代码就可以工作B.h

h

class Imp;  //<--- error here
class B{
    public:
    std::unique_ptr<Imp> imp;
    B();     //<--- move definition to here will compile error
    ~B();
    //// .... other functions ....
};

丙型肝炎

#include "B.h"
#include "Imp.h"
B::B(){ }
~B::B(){ }

进出口

class Imp{};

Main.cpp(编译我)

#include "B.h"

错误:删除指向不完整类型的指针
错误:使用未定义的类型'Imp'C2027

我可以以某种方式理解必须将析构函数移至.cpp,因为的析构Imp可能称为:-

delete pointer-of-Imp;  //something like this

但是,我不明白为什么规则也涵盖构造函数(问题)。

我读过了 :-

土豆泥

如果构造函数异常退出,则构造函数需要销毁该类成员。

我认为使构造函数noexcept无济于事,尽管也许可以。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

pimpl 和 .cpp 文件中定义类的区别

unique_ptr,pimpl / forward声明和完整定义

unique_ptr pimpl和不完整类型

在 pimpl 中传递部分构造的对象

用于 pimpl 的 Unique_ptr 用法 - 即使声明了析构函数也不会编译

C ++ / Pimpl:原始指针还是unique_ptr?有什么更好的选择?

使用std :: unique_ptr的C ++ Pimpl成语不完整类型

模板实例化和带有 unique_ptr 的 pimpl 习惯用法

使用PIMPL习惯用法为可复制的类编写可复制的unique_ptr

dll中的std :: unique_ptr pimpl用Visual Studio生成C4251

PIMPL 类的 setter 应该是 const 成员函数吗?

Pimpl-为什么可以对不完整的类型调用make_unique

为什么在PIMPL中无法访问工具类的常量函数?

cpp中的WaitForSeconds函数

函数执行顺序-cpp

在cpp中用#define定义函数?

在Objective-C中使用C ++类-为什么要使用PImpl习惯用法?

为什么在使用PIMPL习惯用法时此类型不完整?

当您希望接口具有所有内存时,可以替代PIMPL Idiom

使用shared_ptr的Pimpl习惯用法处理不完整类型

无法使用pimpl习惯用法将用户定义的内容插入封装的向量中

我应该在任何地方使用PIMPL吗?

在 C++11 中,我想去掉 pimpl idiom 中的原始指针

使用PIMPL习惯用法时,有什么方法可以限制重复样板?

Qt的Pimpl成语

从python ctypes调用CPP函数

CPP:矩阵析构函数

指针数组和函数 CPP

cpp没有匹配的函数调用来调用构造函数。为什么?