我需要相互包含两个头文件,而不是使用前向声明导致“不完整类型”错误
Posted
技术标签:
【中文标题】我需要相互包含两个头文件,而不是使用前向声明导致“不完整类型”错误【英文标题】:I need to include two header files to each other not using forward declaration cause get "incomplete type" error 【发布时间】:2018-06-04 10:04:56 【问题描述】:我需要相互包含两个头文件,但我无法做到这一点。除了使用前向声明和模板之外,还有其他方法吗?还是我不允许在 c++ 中这样做?
这是我想做的:
// A.hpp file
#ifndef H_A_H
#define H_A_H
#include "B.hpp"
class A
private:
vector<B*> b;
public:
void function()
// using methods of B
;
#endif
// B.hpp file
#ifndef H_B_H
#define H_B_H
#include "A.hpp"
class B
private:
vector<A*> a;
public:
void function()
// using methods of A
;
#endif
【问题讨论】:
1) 是什么阻止您在声明B
之前转发声明A
,反之亦然? 2)您应该在 .cpp 文件中定义方法,其中包含这两个标头。
您还可以创建一个C
类,该类在A
和B
上运行,这样A
和B
就不必“了解”彼此……或者可以使用std::map<A, std::vector<B> >
用于您的 A
->B
映射,然后是 std::map<B, std::vector<A> >
用于您的 B
->A
映射并在您的课程中摆脱 vector
......?
@AlgirdasPreidžius 您提到的第二点正是我的其他问题之一。每当我在 cpp 文件中定义方法时,我都会收到“...的多重定义”错误。
@txtechhelp 谢谢你,但我认为这对我的设计来说不是一个好主意。
@shirazy 然后,您不应该:1)将所述 .cpp 文件包含到其他文件中,或 2)在标头和 .cpp 文件中定义它。
【参考方案1】:
您不能相互包含两个头文件。在其中一个文件中应该有前向声明,并且必须将函数定义推送到可以包含头文件的 .cpp 文件中。
// HeaderA.h file
#ifndef H_A_H
#define H_A_H
#include "HeaderB.h"
class A
private:
int b;
public:
void function()
// using methods of B
B b;
b.function();
;
#endif
// HeaderB.h file
#ifndef H_B_H
#define H_B_H
class A;
class B
private:
int a;
public:
void function();
;
#endif
// Main.cpp
#include "HeaderA.h"
#include "HeaderB.h"
void B::function()
// using methods of A
A a;
a.function();
int _tmain(int argc, _TCHAR* argv[])
return 0;
【讨论】:
【参考方案2】:你有一个循环依赖。这个answer 解释了如何通过前向声明来处理它们。
这个article 也处理循环依赖。
如果您 100% 不想使用前向声明,并且您可以将逻辑拆分到不同的类中并使用组合。
// SomeLogic.h
class SomeLogic
;
// A.h
#include "SomeLogic.h"
class A
SomeLogic someLogic;
;
// B.h
#include "SomeLogic.h"
class B
SomeLogic someLogic;
;
【讨论】:
以上是关于我需要相互包含两个头文件,而不是使用前向声明导致“不完整类型”错误的主要内容,如果未能解决你的问题,请参考以下文章