7

我正在用 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 中。

4

2 回答 2

10

你可以使用 PIMPL 成语(Chesshire Cat,Opaque Pointer,随便你怎么称呼它)。

就像现在的代码一样,您无法隐藏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
};
于 2012-12-16T16:37:54.257 回答
3

比 Pimpl 更简单,您可以使用指向它的指针TypeToHide前向声明

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

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

于 2012-12-16T17:16:39.490 回答