我需要相互包含两个头文件而不使用前向声明导致出现 "incomplete type" 错误
I need to include two header files to each other not using forward declaration cause get "incomplete type" error
我需要相互包含两个头文件,但我很难做到这一点。除了使用前向声明和模板来做到这一点,还有什么办法吗?或者我不允许在 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
你有循环依赖。 answer 解释了如何通过前向声明处理它们。
这个article也处理循环依赖。
如果您 100% 不想使用前向声明,您可以将逻辑拆分成不同的 class 并使用组合。
// SomeLogic.h
class SomeLogic
{
};
// A.h
#include "SomeLogic.h"
class A
{
SomeLogic someLogic;
};
// B.h
#include "SomeLogic.h"
class B
{
SomeLogic someLogic;
};
您不能将两个头文件相互包含。其中一个文件中应该有前向声明,并且必须将函数定义推送到 .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;
}
我需要相互包含两个头文件,但我很难做到这一点。除了使用前向声明和模板来做到这一点,还有什么办法吗?或者我不允许在 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
你有循环依赖。 answer 解释了如何通过前向声明处理它们。
这个article也处理循环依赖。
如果您 100% 不想使用前向声明,您可以将逻辑拆分成不同的 class 并使用组合。
// SomeLogic.h
class SomeLogic
{
};
// A.h
#include "SomeLogic.h"
class A
{
SomeLogic someLogic;
};
// B.h
#include "SomeLogic.h"
class B
{
SomeLogic someLogic;
};
您不能将两个头文件相互包含。其中一个文件中应该有前向声明,并且必须将函数定义推送到 .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;
}