C ++隐藏继承类?

时间:2013-12-16 02:54:55

标签: c++ inheritance c++11 opaque-pointers

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

我有一个我编写的库,它定义了类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”。

有没有人知道如何隐藏B.h?对于解决方案,C ++ 11没问题,但链接到其他依赖项(如boost)不是一种选择。

2 个答案:

答案 0 :(得分:3)

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

// In A.h
class B;

class A
{
private:
    B* opaque;
};

答案 1 :(得分:3)

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

不要将您的A类公开给您的API用户,而是让句柄类只显示您想要的内容:

在A.h

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();
}