有链接类问题? c ++我不知道到底是什么

时间:2017-02-04 02:23:08

标签: 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_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_FOLDER_H     #define C_SSF_FOLDER_H

#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_Folder。 我包括&#34; C_SSF_Folder_Container.h&#34; 并声明一个C_SSF_Folder_Container容器。 在声明变量之前,它编译得很好。我宣布之后 我的C_SSF_Folder_Container中出现语法错误 严重性代码描述项目文件行抑制状态 错误C2061语法错误:标识符&#39; C_SSF_Folder&#39; CSSFileSystem \ projects \ cssfilesystem \ cssfilesystem \ c_ssf_folder_container.h 16
错误C2061语法错误:标识符&#39; C_SSF_Folder&#39; CSSFileSystem \ projects \ cssfilesystem \ cssfilesystem \ c_ssf_folder_container.h 19
当我自己调查它时,我认为存在问题,因为我的C_SSF_Folder包含C_SSF_Folder_Container。 和C_SSF_Folder_Container包括C_SSF_Folder 但是定义应该照顾它吗?除此之外,我不知道问题是什么。

所有内容都输入正确。

2 个答案:

答案 0 :(得分:2)

你有一个循环#include - C_SSF_Folder_Container.h #includes C_SSF_Folder.h和C_SSF_Folder.h #includes C_SSF_Folder_Container.h。

这会导致无限回归(和编译器崩溃),除了你的文件顶部有#ifndef / #define警告(你应该这样做);而且由于它们,你得到的是那两个.h文件中的一个看不到另一个。这就是你得到这些错误的原因。

解决问题的唯一方法是通过删除构成它的两个#include中的一个来打破这个圈子。我建议从C_SSF_Folder_Container.h中删除#include "C_SSF_Folder.h"并使用转发声明(例如class C_SSF_Folder;)。

答案 1 :(得分:0)

C_SSF_Folder.h和C_SSD_Folder_Container.h相互包含(循环依赖)。

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

所以正确的方法是使用前向声明来打破循环依赖(包括彼此)。

在C_SSF_Folder.h中,进行C_SSF_Folder_Container的前向声明。

{{1}}

最后,在C_SSF_Folder.cpp中包含C_SSF_Folder_Container.h。

<小时/> 您还可以通过以下链接了解更多信息:

循环依赖(Wiki):
https://en.wikipedia.org/wiki/Circular_dependency
Scott Langham的前瞻声明
What are forward declarations in C++?