如何在我自己的头文件中不包含boost头文件

时间:2011-10-14 15:33:44

标签: c++ boost graph

我正在上课

在课堂上,我使用boost :: graph :: adjacent_list作为私人成员。

但我不希望我的头文件包含boost头文件,因为任何其他文件包含我的头文件都需要包含boost头文件。

有没有办法可以避免在我自己的头文件中包含boost头文件。

我已尝试过前瞻声明,但失败了。

3 个答案:

答案 0 :(得分:5)

你不能直接这样做,但是你可以解决不通过pimpl你的类传播实现细节(boost)的根本问题。这实质上意味着您转发声明指向实现细节的指针,然后完全在源文件中实现。

答案 1 :(得分:2)

如果您的头文件只是定义,并且完全在cpp文件中实现(即头文件不对boost::graph::adjacent_list执行任何操作,那么在标题中,您可以

  • 转发声明bgalWrapper结构。
  • 指向该结构而不是boost::graph::adjacent_list
  • 在实现头文件的CPP文件中,声明新的 bgalWrapper struct(只有boost::graph::adjacent_list成员)
  • 在类ctor中创建结构的实例(并且 - 显然
    • 在dtor中清理。)

现在每个类都可以引用boost项,而不需要知道有关boost的标题。

这种模式可能有一个名称(和wikipage),但是自从我认真编写C ++以来已经有好几年了。

希望这有帮助。

更新我所描述的是PIMPL Idiom的部分实施 感谢Mark B

答案 2 :(得分:0)

我没有测试它,但你不能将列表定义为指针变量吗?然后前方声明应该成功。您必须嵌套命名空间:

using namespace boost::graph;
class adjacent_list;
class MyClass {
    private adjacent_list<foo, bar> m_list;
}

或者也许:

namespace boost {
    namespace graph {
        class adjacent_list;
    }
}
class MyClass {
    private adjacent_list<foo, bar> m_list;
}

然后在您的实现文件中,只需将其用作指针:

#include <boost/graph/adj_list_serialize.hpp>
MyClass::MyClass() {
    m_list = new adjacency_list<foo, bar>();
}
相关问题