c ++通过复杂的依赖关系获得正确的前向声明
c++ Getting forward declaration correct with complex dependencies
问题
我收到以下编译错误:
error: member access into incomplete type 'IRB'
这发生在使用 class IRB
的第一行,在 HG.h
。
问题
我在这里错过了什么?是 typedef 导致了问题吗?
在每个 header 文件中,如下所示,我转发声明了我将要使用的 class。
更重要的是,我应该遵循什么流程才能正确执行此操作?
Header 个文件
T.h
typedef IRBBase__<true, true> IRB_BASE; // typedef a template instantiation
IRB.h
#include "T.h"
#include "FH.h"
class FH; // FWD DCLR
class IRB : IRB_BASE {..};
FH.h
#include "T.h"
#include "IRB.h"
#include "HG.h"
class IRB; // FWD DCLR
class HG; // FWD DCLR
class FH {..};
HG.h
#include "T.h"
#include "FH.h"
#include "IRB.h"
#include "CU.h"
class FH; // FWD DCLR
class IRB; // FWD DCLR
class CU; // FWD DCLR
class HG {..};
CU.h
#include "T.h"
#include "IRB.h"
#include "FH.h"
class IRB;
class FH;
class CU {..};
编辑:成功了
在 user0042 建议之后,我通过将 headers 从除 HG.h
之外的所有文件移动到它们各自的 .cc
文件中来使其工作。
在 HG.h
中,我保留了前向声明和 header 文件。
此答案基于我收到的评论。
header 文件中的函数声明可能使用了我们不想包含的 class,但这可能会导致循环依赖。
所以解决方案是:
- 将我们在header文件中提到的classes的
#include
移动到源文件
- 在 header 文件中执行 class
的 forward declaration
可以对 header 中 未使用 的任何 class 执行此操作。如果我们使用 header,如以下示例 HG.h
,我们应该将 #include
保留在 header 文件中。
问题示例的解决方案
T.h
typedef IRBBase__<true, true> IRB_BASE; // typedef a template instantiation
IRB.h
class FH; // FWD DCLR
class IRB : IRB_BASE {..};
FH.h
class IRB; // FWD DCLR
class HG; // FWD DCLR
class FH {..};
HG.h
#include "T.h"
#include "FH.h"
#include "IRB.h"
#include "CU.h"
class FH; // FWD DCLR
class IRB; // FWD DCLR
class CU; // FWD DCLR
class HG {..
// some of the classes are used here, because some functions
// were too small and kept them in the header file (defined the function)
// if the same had happened with another of the headers, causing a
// cyclic include dependency, then I should have converted
// some of the function definitions into declarations, and move the
// implementation of the file in the source file (.cc)
};
CU.h
class IRB;
class FH;
class CU {..};
问题
我收到以下编译错误:
error: member access into incomplete type 'IRB'
这发生在使用 class IRB
的第一行,在 HG.h
。
问题
我在这里错过了什么?是 typedef 导致了问题吗?
在每个 header 文件中,如下所示,我转发声明了我将要使用的 class。
更重要的是,我应该遵循什么流程才能正确执行此操作?
Header 个文件
T.h
typedef IRBBase__<true, true> IRB_BASE; // typedef a template instantiation
IRB.h
#include "T.h"
#include "FH.h"
class FH; // FWD DCLR
class IRB : IRB_BASE {..};
FH.h
#include "T.h"
#include "IRB.h"
#include "HG.h"
class IRB; // FWD DCLR
class HG; // FWD DCLR
class FH {..};
HG.h
#include "T.h"
#include "FH.h"
#include "IRB.h"
#include "CU.h"
class FH; // FWD DCLR
class IRB; // FWD DCLR
class CU; // FWD DCLR
class HG {..};
CU.h
#include "T.h"
#include "IRB.h"
#include "FH.h"
class IRB;
class FH;
class CU {..};
编辑:成功了
在 user0042 建议之后,我通过将 headers 从除 HG.h
之外的所有文件移动到它们各自的 .cc
文件中来使其工作。
在 HG.h
中,我保留了前向声明和 header 文件。
此答案基于我收到的评论。
header 文件中的函数声明可能使用了我们不想包含的 class,但这可能会导致循环依赖。
所以解决方案是:
- 将我们在header文件中提到的classes的
#include
移动到源文件 - 在 header 文件中执行 class 的
forward declaration
可以对 header 中 未使用 的任何 class 执行此操作。如果我们使用 header,如以下示例 HG.h
,我们应该将 #include
保留在 header 文件中。
问题示例的解决方案
T.h
typedef IRBBase__<true, true> IRB_BASE; // typedef a template instantiation
IRB.h
class FH; // FWD DCLR
class IRB : IRB_BASE {..};
FH.h
class IRB; // FWD DCLR
class HG; // FWD DCLR
class FH {..};
HG.h
#include "T.h"
#include "FH.h"
#include "IRB.h"
#include "CU.h"
class FH; // FWD DCLR
class IRB; // FWD DCLR
class CU; // FWD DCLR
class HG {..
// some of the classes are used here, because some functions
// were too small and kept them in the header file (defined the function)
// if the same had happened with another of the headers, causing a
// cyclic include dependency, then I should have converted
// some of the function definitions into declarations, and move the
// implementation of the file in the source file (.cc)
};
CU.h
class IRB;
class FH;
class CU {..};