【问题标题】:how to not include boost header file in my own header file如何在我自己的头文件中不包含 boost 头文件
【发布时间】:2011-10-14 15:33:43
【问题描述】:

我在写课

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

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

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

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

【问题讨论】:

  • 如果有人包含一个需要 Boost 才能工作的文件,那么该文件包含 Boost 不是吗?我在这里错过了什么吗?
  • 我不明白你不想包含 boost 标头的原因。
  • 你不是很清楚。 google pimpl idiom,也许这对你来说很合适。
  • @KAK OP 可能希望避免传播仅用作类的实现细节的标头包含。

标签: c++ boost graph


【解决方案1】:

你不能直接这样做,但你可以通过pimpl你的班级来解决不传播实现细节(提升)的潜在问题。这实质上意味着您向前声明一个指向您的实现细节的指针,然后在源文件中完全实现。

【讨论】:

    【解决方案2】:

    如果您的头文件只是定义,并且在 cpp 文件中完全实现(即头文件不与 boost::graph::adjacent_list 做任何事情,那么在您的头文件中,您可以

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

    现在每个类都可以引用 boost 项,而不需要标题了解 boost。

    这种模式可能有一个名称(和 wikipage),但我已经多年没有认真编写 C++ 了。

    希望这会有所帮助。

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

    【讨论】:

      【解决方案3】:

      我没有测试过,但是你不能把列表定义为指针变量吗?那么前向声明应该会成功。不过,您必须嵌套命名空间:

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

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 2010-11-07
        • 1970-01-01
        相关资源
        最近更新 更多