c ++抽象类的递归头

时间:2012-05-31 14:35:44

标签: c++ recursion abstract inheritance inherited

假设我想编译这样的东西:

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

#include "Terza.h"

class Prova{
public:
 Prova();

};
#endif

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

#include "EreProva.h"

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

//EreProva.h:
//--------------------
#ifndef _EREPROVA_
#define _EREPROVA_

#include "Prova.h"

class EreProva : public Prova{
  public:
  EreProva();
};
#endif

没有编译说“'Prova':基类未定义”。

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

3 个答案:

答案 0 :(得分:4)

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

克服循环依赖关系的一个方法是使用 Forward Declarations ,但请注意,一旦转发声明类型,编译器的类型将变为不完整类型关于你可以用它做什么操作的限制。您无法对需要编译器知道该类型的内存布局的类型实例执行任何操作。

好读:
When can I use a forward declaration?

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在此代码中:

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

#include "Terza.h"

class Prova{
public:
 Prova();

};

由于您未以任何方式使用Tezra课程,因此您不需要#include。拿出来。此外,你缺少#endif。关闭此文件中的#ifndef,并在此文件中匹配#endif

此外:

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

#include "EreProva.h"

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

#endif

您根本不会在此文件中使用EreProva类,因此请取出#include语句。您还在文件末尾有一个额外的#endif。这里只有一个#ifndef,所以应该只有一个#endif。拿出最后一个。