我在C ++中创建一个静态库来定义其他人可以在其代码中使用的类。但是,该类的成员是从其他人获取的头文件中定义的类型,我不想分发此人的头文件的内容。
这是当前的公共接口(interface.h):
class B {
TypeToHide t;
// other stuff ...
};
class A {
double foo();
B b;
};
以下是将编译成静态库(code.cpp)的代码:
double A::foo() {
// ...
}
这是我需要在公共视图中隐藏的内容(HideMe.h)的文件:
struct TypeToHide {
// stuff to hide
};
我该怎么做才能隐藏HideMe.h的内容?理想情况下,我可以将整个结构从HideMe.h粘贴到code.cpp。
答案 0 :(得分:7)
你可以使用PIMPL习语(柴郡猫,不透明指针,无论你想叫什么)。
由于代码现在,您无法隐藏TypeToHide
的定义。另一种选择是:
//publicHeader.h
class BImpl; //forward declaration of BImpl - definition not required
class B {
BImpl* pImpl; //ergo the name
//wrappers for BImpl methods
};
//privateHeader.h
class BImpl
{
TypeToHide t; //safe here, header is private
//all your actual logic is here
};
答案 1 :(得分:1)
比Pimpl更简单,您可以使用指向TypeToHide
和forward declaration的指针:
class B {
TypeToHide* t;
// other stuff ...
};
只要您不需要了解用户代码的内部结构,就不必暴露它,它将在您的库中保持安全。
库中的代码必须知道TypeToHide
是什么,但这不是问题。