C++ c++;抽象类的递归头

C++ c++;抽象类的递归头,c++,recursion,abstract,inheritance,inherited,C++,Recursion,Abstract,Inheritance,Inherited,假设我想编译如下内容: //Prova.h: //-------------------- #ifndef _PROVA_ #define _PROVA_ #include "Terza.h" class Prova{ public: Prova(); }; #endif 及 及 编译时不会说“Prova”:基类未定义 避免继承类之间的头递归的最佳方法是什么?有时,您可以通过尝试以下方法来解决此类问题:(1)尝试在文件顶部添加“#pragma once”指令,尽管这

假设我想编译如下内容:

//Prova.h:
//--------------------
#ifndef _PROVA_
#define _PROVA_

#include "Terza.h"

class Prova{
public:
 Prova();

};
#endif

编译时不会说“Prova”:基类未定义


避免继承类之间的头递归的最佳方法是什么?

有时,您可以通过尝试以下方法来解决此类问题:(1)尝试在文件顶部添加“#pragma once”指令,尽管这可能是特定于编译器的(我不久前在VC++中开发时使用过它)(2)不必在类中包含头文件,您可以尝试添加“class Prova”或任何类,以指示稍后将定义但现在要“使用”的类


虽然正如Als所说,最好避免这种设计

如果您需要具有循环依赖关系,那么您的设计有问题,您应该重新审视您的设计,并尝试删除这些复杂和不需要的循环依赖关系

克服循环依赖性的一个方法是使用,但请注意,一旦向前声明了一个类型,编译器的类型就变成了不完整的类型,并且可以对其执行的操作也有限制。您不能对该类型实例执行任何需要编译器知道该类型内存布局的操作

读得好:

在此代码中:

//Prova.h:
//--------------------
#ifndef _PROVA_
#define _PROVA_

#include "Terza.h"

class Prova{
public:
 Prova();

};
由于您不以任何方式使用
Tezra
类,因此不需要
#include
。把它拿出来。还有,你失踪了,还有#endif。使用此文件中匹配的
#endif
关闭此文件中的
#ifndef

此外:

//Terza.h:
//--------------------
#ifndef _TERZA_
#define _TERZA_

#include "EreProva.h"

class Terza{
public:
  Terza();
};
#endif

#endif

您在这个文件中也根本不使用
EreProva
类——因此去掉
#include
语句。文件末尾还有一个额外的
#endif
。这里只有一个
#ifndef
,因此应该只有一个
#endif
。把最后一个拿出来。

+1用于提及破损的设计。这是很重要的一点,而不是一些语法技巧来绕开它。让我们假设Terza是一张地图。普罗瓦是想在地图上移动的东西。埃雷普罗瓦是该地图的一个基本正方形。要移动普罗瓦,我需要知道地图。为了绘制地图,我需要使用正方形。哦,我还忘了提到,除非我做了错事,否则前向声明不起作用。我知道我没有使用包含,这只是一个示例。请发布实际代码,演示您遇到的真正问题。然后我们可以给你更好的建议。谢谢你的回复。我的问题是如何编译这个东西。。我需要使用所有包含的标题。例如,在Terza中实例化变量EreProva,在Prova中实例化变量Terza。我想知道除了重新思考类的依赖性之外,是否还有其他方法,这有什么抽象的?你应该接受Aok Save的回答。
//Prova.h:
//--------------------
#ifndef _PROVA_
#define _PROVA_

#include "Terza.h"

class Prova{
public:
 Prova();

};
//Terza.h:
//--------------------
#ifndef _TERZA_
#define _TERZA_

#include "EreProva.h"

class Terza{
public:
  Terza();
};
#endif

#endif