隐藏第三方C ++头文件的内容

时间:2012-12-16 16:36:21

标签: c++ hide static-libraries header-files

我在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。

2 个答案:

答案 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更简单,您可以使用指向TypeToHideforward declaration的指针:

class B {
    TypeToHide* t;
    // other stuff ...  
};

只要您不需要了解用户代码的内部结构,就不必暴露它,它将在您的库中保持安全。
库中的代码必须知道TypeToHide是什么,但这不是问题。