有链接类问题吗?C++我没有线索,什么是

有链接类问题吗?C++我没有线索,什么是,c++,class,C++,Class,我有三节课 头等舱: #ifndef C_LINKED_LIST_H #define C_LINKED_LIST_H class CLinkedList { private: //removed code for brevity public: // removed code for brevity }; #endif 二等舱: #ifndef C_SSF_FOLDER_CONTAINER_H #define C_SSF_FOLDER_CONTAINER_H #include "C_S

我有三节课

头等舱:

#ifndef C_LINKED_LIST_H
#define C_LINKED_LIST_H

class CLinkedList {
private:
//removed code for brevity

public:
// removed code for brevity
};

#endif
二等舱:

#ifndef C_SSF_FOLDER_CONTAINER_H
#define C_SSF_FOLDER_CONTAINER_H

#include "C_SSF_Folder.h"
#include "CLinkedList.h"

class C_SSF_Folder_Container {
private:
    // removed code for brevity

public:
    int Add_Folder(C_SSF_Folder *_pcl_SSF_Folder);
    C_SSF_Folder *Get_Folder(int _i_Index);
    C_SSF_Folder *Get_Folder(char *_pch_Name);
        //^-----errors
};

#endif C_SSF_FOLDER_CONTAINER_H
我的第三节课 ifndef C_SSF_文件夹 定义C_SSF_文件夹

#include <windows.h>
#include <fstream>
#include "C_SSF_Folder_Container.h"

using namespace std;

class C_SSF_Folder {
public:

private:
    C_SSF_Folder_Container cl_SSFFC_Folder_Container;

public:

};

#endif
我的第三类C_SSF_文件夹。 我包括C_SSF_文件夹_容器.h 以及声明一个C_SSF_文件夹_容器。 在声明变量之前,它编译得很好。在我申报之后 我的C_SSF_文件夹_容器中出现语法错误 严重性代码说明项目文件行抑制状态 错误C2061语法错误:标识符“C\U SSF\U文件夹”CSSFileSystem\Project\CSSFileSystem\CSSFileSystem\C\U SSF\U文件夹\U容器。h 16 错误C2061语法错误:标识符“C\U SSF\U文件夹”CSSFileSystem\Project\CSSFileSystem\CSSFileSystem\C\U SSF\U文件夹\U容器。h 19 当我自己研究它时,我认为有一个问题,因为我的C_SSF_文件夹包括C_SSF_文件夹容器。 C_SSF_Folder_容器包括C_SSF_Folder 但是定义应该处理它吗?除此之外,我不知道问题出在哪里


所有内容都输入正确。

您有一个循环include-C\u SSF\u Folder\u Container。h包括C\u SSF\u Folder.h和C\u SSF\u Folder。h包括C\u SSF\u Folder\u Container.h

这将导致无限回归和编译器崩溃,除非您在文件的顶部设置了ifndef/define保护;因为它们,你得到的是这两个.h文件中的一个看不到另一个,这就是为什么你会出现这些错误


解决此问题的唯一方法是通过删除两个包含项中的一个来打破圆圈。我建议从C_SSF_Folder_Container.h中删除include C_SSF_Folder.h,并使用转发声明,例如class C_SSF_Folder;相反。

C\u SSF\u Folder.h和C\u SSD\u Folder\u Container.h彼此包含循环依赖关系

当编译器编译C_SSF_Folder_容器对象时,它需要创建一个C_SSF_Folder对象作为其字段,但是,编译器需要知道C_SSF_Folder对象的大小,因此它到达C_SSF_Folder对象并尝试构造它。问题是,当编译器构造C_SSF_Folder对象时,该对象的字段是C_SSF_Folder_Container对象,这是一个典型的鸡和蛋问题,两个文件相互依赖才能编译

因此,正确的方法是使用转发声明来打破循环依赖关系,包括彼此

在C_SSF_Folder.h中,对C_SSF_Folder_容器进行转发声明

#include <windows.h>
#include <fstream>

using namespace std;

class C_SSF_Folder_Container;

class C_SSF_Folder {
public:

private:
    C_SSF_Folder_Container cl_SSFFC_Folder_Container;

public:

};

#endif
最后,将C_SSF_Folder_Container.h包含在C_SSF_Folder.cpp中

您还可以通过以下链接了解更多信息: 循环依赖维基: 提交声明

欢迎来到堆栈溢出。请花点时间阅读并参考您可以在这里询问的内容和方式。非常感谢您的可能副本。我成功了!我在头文件中提出了类的前向声明。但当我试图使用类定义变量中的函数时,这给了我一些问题。所以通过浏览网页,我意识到我需要声明我正在调用的函数。这让我陷入了一个漩涡,到处乱搞各种奇怪的东西。在我在头文件中声明类之后,我在.cpp中包含了该类的头文件。这起作用了。这是正确的做法吗?还是我使用了一个糟糕的habbit解决方案?在.cpp文件中声明一个类除了.h文件之外还有其他包含的.cpp是正常的吗?有些编译器有自己的保护,没有ifdef,但循环头会导致意外行为。我从未见过任何编译器崩溃,但它可能会开始出现奇怪的错误,比如未知标识符等等。我在头文件中提出了类的前向声明。但当我试图使用类定义变量中的函数时,这给了我一些问题。所以通过浏览网页,我意识到我需要声明我正在调用的函数。这让我陷入了一个漩涡,到处乱搞各种奇怪的东西。在我在头文件中声明类之后,我在.cpp中包含了该类的头文件。这起作用了。这是正确的做法吗?或者我使用的是一个糟糕的habbit解决方案?有一个.cpp声明一个类在.cpp文件中除了它的.h文件之外还有其他包含项是正常的吗?@ShakeSpear我不是很专业,所以我不知道这是否是一个坏的做法,但我认为cpp包含是完全正确的,cpp文件可以包含它们自己的头文件,那么为什么其他头文件不包含呢?顺便说一句,如果在Cάu SSCάu Folder.cpp中不包含Cάu SSCάu FolderάContainer.h,它会给您带来很多错误,因为您在头文件中转发了声明的类Cάu SSCάu Folderά容器,但没有提供它的定义。参考πάντταῥεῖ 's注释,cpp文件可以包含其他文件头great。谢谢非常感谢!