C++ 我不断收到一个错误,说我的类没有命名类型

C++ 我不断收到一个错误,说我的类没有命名类型,c++,class,C++,Class,我有一个类,叫做A,它有自己的头文件。然后我有另一个类,叫做B,它也有自己的头文件。它们都有自己的.cpp文件,我在其中实现了它们的所有功能 我试图让B类有一个a类类型的变量作为私有变量,但我不断得到错误“a”没有命名类型 我的代码如下所示: 主要条款h: #ifndef MAIN_H #define MAIN_H #include "A.h" #include "B.h" #endif // not needed main.cpp: #include "main.h" int mai

我有一个类,叫做A,它有自己的头文件。然后我有另一个类,叫做B,它也有自己的头文件。它们都有自己的.cpp文件,我在其中实现了它们的所有功能

我试图让B类有一个a类类型的变量作为私有变量,但我不断得到错误“a”没有命名类型

我的代码如下所示:

主要条款h:

#ifndef MAIN_H
#define MAIN_H

#include "A.h"
#include "B.h"

#endif
// not needed
main.cpp:

#include "main.h"

int main( int argc, char* args[]) {
  B test;
}
#include "B.h" // for using class B

int main( int argc, char* args[]) {
  B test;
}
A.h:

B.h:

所以我所有的include都在main.h中,在B.B之前包含A.B有一个类型为A的变量,但它是从main.h中包含的,B.h包括main.h。然而,我不断收到一个错误,说:

error: 'A' does not name a type.

我在谷歌上搜索了一下,这似乎意味着在使用A时它没有定义,但应该在那里定义,因为它包含在main.h中,对吗?

A.h在顶部包含main.h

Main.h跳过A.h,因为已经定义了
A_h
,然后包括B.h


B.h尝试使用
A
,但A.h尚未完成编译,因此未定义类型。

问题是
A.h
包括
main.h
,其中包括
B.h
,后者尝试使用
A

组织文件的好方法是:

主要条款h:

#ifndef MAIN_H
#define MAIN_H

#include "A.h"
#include "B.h"

#endif
// not needed
main.cpp:

#include "main.h"

int main( int argc, char* args[]) {
  B test;
}
#include "B.h" // for using class B

int main( int argc, char* args[]) {
  B test;
}
A.h:

B.h:


通过这种方式,
B.h
是一个独立的并且可以在不包含任何其他内容的情况下使用。这是非常重要的,一旦你的项目发展到现在的玩具水平之上。为什么试图使用
x.h
标题所提供内容的人还需要知道包括
f.h
m.h
u.h

如果添加;在B.h.的末尾

更好的方法是在“B.h”中加入“A.h”,而不是“main.h”

但这可能与你的问题无关


如果您正在使用模板而忘记了“typename”,那么这种错误也可能会令人困惑。

为什么不在
main.cpp
中包含
B.h
,在
B.h
中包含
A.h
?只包括你需要的东西。我很好奇你的编译器是否被include递归弄糊涂了
main.h
->
A.h
->
main.h
,等等@Mark Loeser:guard常量(xx_h)可以避免递归问题,但是include策略确实非常奇怪。@特洛伊敌人:是的……这是非常漫长的一天。我真的应该回家:)这是有道理的,但是我把所有的东西都放在main.h里面,并且把所有的东西都放在main.h里面,因为否则我总是很难把其他东西放进去。我有一大堆不同的类都需要SDL.h,以前包含它没有问题,但现在我改变了所有内容的包含方式,我的需要SDL.h的文件中有一半表示其中所有的SDL函数都是未定义的,尽管我在该文件的顶部包含了SDL.h。没关系,显然,在我重新整理代码后,代码块中链接SDL的默认设置不起作用。我直接链接了-lSDL和-lSDLmain,而不是
sdlconfig
,现在它似乎可以编译了。谢谢发布的代码实际上是有效的。它首先包括main.h,main.h包括A.h,所以当B需要时,A已经声明了。