另一个标头循环依赖项

Yet another header circular dependency

本文关键字:依赖 循环 另一个      更新时间:2023-10-16

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

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

Exception.hpp中的Exception
  • CCD_ 3在CCD_
  • 依赖项为:

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

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

    在声明之前有一个前向声明,并在声明和定义之间包含另一个头的解决方案不起作用,正如我所说的,Exception在其声明中需要一个完整类型的CallStack

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

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

    为声明(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"