类名不声明类型C ++

时间:2014-03-25 07:11:07

标签: c++ class compiler-errors

我正在尝试编译我的代码,但是我遇到了类错误。其中一个类编译得很好(Example.h),但另一个(Name.h)一直给我的类没有名称类型错误。我认为它与循环依赖有关,但如何在没有前向减速的情况下修复它?

Name.h

#ifndef _NAME
#define _NAME
#include <iostream>
#include <string>
using namespace std;
#include "Example.h"
class Name{
};
#endif

example.h文件

#ifndef _EXAMPLE
#define _EXAMPLE
#include <iostream>
#include <string>
using namespace std;
#include "Name.h"
class Example{

};
#endif

我看到一篇关于使用前向减速的帖子,但我需要从Example类中访问成员..

3 个答案:

答案 0 :(得分:2)

你有一个循环依赖,其中每个标题都试图包含另一个,这是不可能的。结果是一个定义在另一个定义之前结束,而第二个定义的名称在第一个定义中不可用。

尽可能声明每个类而不是包含整个标题:

class Example; // not #include "Example.h"

如果一个类实际上包含(或继承)另一个类,那么你将无法做到这一点;但这将允许在许多声明中使用该名称。由于两个类都不可能包含另一个类,因此您将能够执行此操作(或者可能只删除#include至少其中一个),这应该打破循环依赖关系并修复问题。

此外,请勿_NAME使用reserved namesusing namespace std;不要使用pollute the global namespace

答案 1 :(得分:1)

请参阅,#include "Example.h"中的Name.h#include "Name.h"中的Example.h。假设编译器首先编译Name.h文件,以便现在定义_NAME,然后它尝试编译Example.h这里编译器想要包含Name.h,但Name.h的内容将由于Example.h已定义,_NAME未包含在class Name中,因此Example.h内未定义class Name;

您可以在Example.h

中明确做出{{1}}的前瞻性声明

答案 2 :(得分:0)

试试这个:

<强> Name.h

#ifndef NAMEH
#define NAMEH
#include <iostream>
#include <string>
using namespace std;

//#include "Example.h"
class Example;

class Name{
};
#endif

<强> Name.cpp

#include "Name.h"
#include "Example.h"
...

<强> example.h文件

#ifndef EXAMPLEH
#define EXAMPLEH
#include <iostream>
#include <string>
using namespace std;

//#include "Name.h"
class Name;

class Example{

};
#endif

<强> Example.cpp

#include "Example.h"
#include "Name.h"
...