【发布时间】:2013-12-16 02:54:54
【问题描述】:
我试图从链接它的可执行文件中隐藏在我编写的库的主类头中包含第三方文件。我的意思是:
我编写了一个定义类 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)不是一种选择。
【问题讨论】:
-
真的需要A继承B吗?
-
@drescherjm 不幸的是。
-
对于继承,您必须参见
B的定义。您可以通过在您的类A中向B&和const B&提供强制转换运算符并在您的实现中使用 Pimpl 习惯用法来避免这种情况。 -
@RalphTandetzky,这无济于事 - 任何使用
B&的代码都必须包含B.h,这又会导致问题。 -
@MarkRansom 我知道,但无论如何都隐藏了包含,并且客户端代码不必包含
B.h,即使它可以。以这种方式,至少避免了编译时依赖性。如果B接口根本不可用,那么公共继承又有什么意义呢?
标签: c++ inheritance c++11 opaque-pointers