C++ 我不断收到一个错误,说我的类没有命名类型
我有一个类,叫做A,它有自己的头文件。然后我有另一个类,叫做B,它也有自己的头文件。它们都有自己的.cpp文件,我在其中实现了它们的所有功能 我试图让B类有一个a类类型的变量作为私有变量,但我不断得到错误“a”没有命名类型 我的代码如下所示: 主要条款h: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
#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已经声明了。