我正在尝试编译我的代码,但是我遇到了类错误。其中一个类编译得很好(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类中访问成员..
答案 0 :(得分:2)
你有一个循环依赖,其中每个标题都试图包含另一个,这是不可能的。结果是一个定义在另一个定义之前结束,而第二个定义的名称在第一个定义中不可用。
尽可能声明每个类而不是包含整个标题:
class Example; // not #include "Example.h"
如果一个类实际上包含(或继承)另一个类,那么你将无法做到这一点;但这将允许在许多声明中使用该名称。由于两个类都不可能包含另一个类,因此您将能够执行此操作(或者可能只删除#include
至少其中一个),这应该打破循环依赖关系并修复问题。
此外,请勿_NAME
使用reserved names,using 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
答案 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"
...