又一个标题循环依赖

时间:2014-01-14 23:04:44

标签: c++ c++11 header-files circular-dependency

我知道这个网站上有很多关于循环依赖的答案,但是我发现的没有一个可以解决我的问题,主要是因为我的定义在标题中内联。

我正在用C ++ 11编写一个库。为简化起见,我有两个类:

    Exception
  • Exception.hpp {li> CallStack CallStack.hpp

依赖关系是:

  • Exception大量使用CallStack(在声明和定义中都需要完整类型 CallStack),因此Exception.hpp包含{ {1}}。
  • CallStack.hpp在声明中根本不需要CallStack。它只需要在一个成员定义(Exception)中抛出Exception(调用非默认的Exception构造函数),因此它需要一个完整类型的operator[]在定义中。

我知道如果我在Exception文件中编写定义,我会解决问题,但由于所有方法和构造函数都没有超过2行,我选择将它们内联定义,这意味着他们需要在.cpp标题中定义。

在声明之前有一个前向声明并在声明和定义之间包含另一个标题的解决方案不起作用,因为,我已经说过,.hpp需要一个完整类型的Exception在其声明中。

2 个答案:

答案 0 :(得分:4)

  

我知道如果我在.cpp文件中编写定义,我会解决问题,但由于所有方法和构造函数都没有超过2行,我选择将它们内联定义,这意味着它们需要在.hpp标题中定义。

在.cpp文件中编写定义确实是正确的解决方案。您需要在Exception中转发声明CallStack类型,并将使用Exception的函数的实现详细信息移动到.cpp文件中。

答案 1 :(得分:2)

为声明(foo-declarations.hpp)和内联(foo-inlines.hpp)创建单独的标头,并按顺序包含:

#include "Callstack-declarations.hpp"
#include "Exception-declarations.hpp"
#include "Callstack-inlines.hpp"
#include "Exception-inlines.hpp"

如果您不想在任何地方重复四行,请将这四行标记在另一个标题"Callstack+Exception.hpp"中。或者包含最少的内容:

// Exception.hpp
#include "Callstack-declarations.hpp"
#include "Exception-declarations.hpp"
#include "Exception-inlines.hpp"
// Callstack.hpp
#include "Callstack-declarations.hpp"
#include "Exception-declarations.hpp"
#include "Callstack-inlines.hpp"