我试图隐藏在我编写的库中的主类头中包含第三方文件,从链接它的可执行文件中。我的意思是:
我有一个我编写的库,它定义了类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)不是一种选择。
答案 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();
}