4

我使用了几个 3rd 方库,比如 boost,我的项目中有一个类,假设它叫做“MyClass”

“MyClass”的所有公共函数只使用标准类型(int、char、string),但私有函数使用来自 boost 的智能指针和来自其他库的其他算法。

因此,在我在 H 文件中编写类(及其函数)的声明之前,我编写了几个包含文件。

为了使项目编译,我在项目属性中添加了一些附加包含库。一切正常。

问题是,当我想从另一个名为 USERPROJECT 的项目(该类是 extern)中使用这个类时,我需要在 USERPROJECT 项目中包含 MyClass.h 文件,然后什么都不会编译,因为 MyClass.h 包含 boost 和其他东西没有在 USERPROJECT 中配置(我没有在这里配置额外的包含库,我不想因为他不需要知道它们,它们在 MyClass 类的私有函数中)。

我的解决方案是什么?

  1. 我应该将 MyClass 拆分为 2 类,一类用于接口,一类用于实现?
  2. 我应该从 H 和 MyClass 中删除所有包含并使用前向声明吗?(我试过但编译失败)
  3. 有没有更好的解决方案

提前致谢

4

2 回答 2

2

您可以使用 pimpl 习惯用法创建编译器防火墙:

// header file
class C
{
public:
    ...
private:
    struct Impl;
    boost::scoped_ptr<Impl> m;
};

// cpp file
struct C::Impl
{
    // data member that were in C previously go here //
};

这样,使用您的头文件的代码看不到您的类的内容。这个成语在这里详细解释。但是,如果您使用需要链接的 boost 库,您仍然可能会遇到链接错误。如果您仅使用 boost 的仅标头部分,那么应该没有问题。

于 2013-06-05T14:35:10.837 回答
0

理想的情况是在每个项目中都可以访问每个外部组件。(并且所有都使用兼容的选项等编译)。

如果你能朝着那个方向努力,你的问题就会得到解决。以及周围其他想要使用 boost 但面临同样障碍的人的问题。

如果你不能这样做,你可能仍然有使用 pimpl 的解决方案,但它增加了许多复杂性、维护开销并在一定程度上降低了可读性。并且取决于您从 boost 中使用的内容,可能只能解决问题的编译部分,因为链接可能需要一些额外的库。(除非你的东西是独立的,比如 DLL)

对于后一种情况,如果链接发生在客户端站点,则走私库是强制性的,但是要获得全面提升并避免混乱,工作量是相同的。所以在行动之前做一些研究。

于 2013-06-05T14:36:22.217 回答