3

我试图从链接它的可执行文件中隐藏在我编写的库的主类头中包含第三方文件。我的意思是:

我有一个我编写的库,它定义了 A 类。A 类继承自 B 类(在第三方库中定义)。例子:

// In A.h
#include “B.h”
class A : public B
{
    A* something(A* val);
}

// In A.cpp
A* A::something(A*val)
{
    // Do something
    return val;
}

B 类的头文件对环境进行了一些更改,这些更改对我的库来说是理想的,但对链接我的库的任何可执行文件都是有害的。有人向我指出不透明指针作为一种潜在的解决方案,尽管我不知道如何使用它们来隐藏“B”。

有谁知道隐藏包含 Bh 的方法?对于解决方案,C++11 是可以的,但链接到其他依赖项(如 boost)不是一种选择。

4

2 回答 2

3

在 C++ 世界中隐藏“实现”的一种正常方法是使用 Pimpl/Handle-body/bridge 习惯用法。

与其将您的 A 类公开给 API 的用户,不如使用一个仅公开您想要的内容的句柄类:

在啊

class AImpl;  // forward declaration

class A {
private:
  AImpl* impl;

public:
  foo();
  bar();
}

然后将您的实际实现放在另一个文件中:

AImpl.h

#include <B.h>

class AImpl: public B {
private:
public:
  foo();
  bar();
  somethingThatYouDontWantToExpose();
}
于 2013-12-16T06:32:19.477 回答
3

使用不透明指针的方法是转发声明您需要使用的类,这样您就不需要include它们的定义。由于您不包括B.h图书馆的客户,因此他们的定义不会受到污染。

// In A.h
class B;

class A
{
private:
    B* opaque;
};
于 2013-12-16T03:08:35.443 回答