|
|
1
10
主要的优点是接口的客户机不必包含所有类的内部依赖项的头。因此,对这些标题的任何更改都不会级联到大多数项目的重新编译中。再加上关于实现隐藏的一般理想主义。 另外,您不必将impl类放在它自己的头中。只需使它成为单个cpp中的结构,并使外部类直接引用其数据成员。 编辑: 例子
|
|
2
7
有很多答案。。。但到目前为止还没有正确的实施。我有点难过的例子是不正确的,因为人们可能会使用它们。。。
1什么时候需要包含? 使用类时,仅当满足以下条件时才需要其完整定义:
如果只引用它或有指向它的指针,那么由于引用或指针的大小不依赖于引用/指向的类型,因此只需要声明标识符(正向声明)。
2实施Pimpl 因此,Pimpl的思想是使用指向实现类的指针,这样就不需要包含任何头文件:
为了便于使用,Pimpl习惯用法可以与“智能指针”管理样式一起使用:
有什么其他人没有的?
在此基础上,我们现在可以很容易地定义Pimpl类:
:编译器无法在此处生成正确的构造函数、复制赋值运算符或析构函数,因为这样做需要访问
这样做需要更改pimpl的“副本”:
然后我们就可以定义
请注意
因此,您的客户不必担心会添加方法或属性的特定修补程序,您也不必担心内存布局等。。。它只是自然而然地起作用。 |
|
|
3
5
使用PIMPL习惯用法,如果IMPL类的内部实现细节发生更改,则不必重建客户机。IMPL类(以及头文件)接口的任何更改显然都需要PIMPL类进行更改。 顺便说一句, 在显示的代码中,IMPL和PIMPL之间存在强耦合。因此,IMPL类实现中的任何更改也会导致需要重建。 |
|
|
4
4
现在没人需要知道我们对
|
|
|
5
3
一般来说,任何可以声明的
|
|
|
6
1
在 类头.hpp文件在一个大的bucket中定义类的公共和私有组件。 private与您的实现紧密耦合,因此这意味着您的.hpp文件确实可以提供很多关于内部实现的信息。 考虑一下类似 你选择在课堂内私下使用。如果不使用Pimpl,线程类和类型可能会作为私有成员或私有方法上的参数遇到。好吧,线程库可能是一个不好的例子,但是您得到了这样一个想法:类定义的私有部分应该隐藏起来,不让那些包含头的部分看到。 指向实现的指针 当您更改私有方法(实现)时,您正在更改隐藏在Pimpl下面的内容,因此您的类的客户机不需要重新编译,因为从他们的角度来看,什么都没有更改:它们不再是 看见 |
|
7
1
如果任何成员在另一个头中声明了复杂类型,那么可以看到p-impl将该头的包含从类的公共头移到实现文件中,因为您形成了指向不完整类型的原始指针(但不是嵌入字段或智能指针)。您可以单独使用指向所有成员变量的原始指针,但是使用指向所有状态的单个指针可以简化内存管理并改进数据的局部性(如果所有这些类型都依次使用p-impl,那么就没有太多的局部性)。 |