我正在阅读Herb Sutter的"Exceptional C++"一书,在那本书中我学到了关于pImpl的习语.基本上,我们的想法是为a的private对象创建一个结构class并动态分配它们以减少编译时间(并且还以更好的方式隐藏私有实现).
例如:
class X
{
private:
C c;
D d;
} ;
Run Code Online (Sandbox Code Playgroud)
可以改为:
class X
{
private:
struct XImpl;
XImpl* pImpl;
};
Run Code Online (Sandbox Code Playgroud)
并且,在CPP中,定义:
struct X::XImpl
{
C c;
D d;
};
Run Code Online (Sandbox Code Playgroud)
这看起来很有趣,但我以前从未见过这种方法,既没有在我工作的公司,也没有在我看过源代码的开源项目中.所以,我想知道这种技术真的在实践中使用了吗?
我应该在任何地方使用它,还是谨慎使用?这种技术是否建议用于嵌入式系统(性能非常重要)?
我知道你可以这样做:
def.h:
A();
int x;
Run Code Online (Sandbox Code Playgroud)
啊
class A
{
public:
#include "def.h"
}
Run Code Online (Sandbox Code Playgroud)
A.cpp
A::A()
{
x = 0;
}
int main()
{
A a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:你为什么要这样做?有什么好处吗?我可以看到如果你有一些具有相同成员但不是相同基础的类会有什么帮助,但是值得麻烦吗?它不是很易读,是吗?另外,编译器如何处理这些包含?它只是将标题的内容粘贴到它所包含的内容(有点像宏)吗?