-1

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

//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':未定义的基类”。

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

4

3 回答 3

4

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

克服循环依赖的一种方法是使用Forward Declarations,但请注意,一旦您转发声明一个类型,该类型就会成为编译器的不完整类型,并且您可以使用它执行哪些操作是有限制的。您不能对需要编译器知道类型的内存布局的类型实例执行任何操作。

好读:
我什么时候可以使用前向声明?

于 2012-05-31T14:41:11.443 回答
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。把最后一个拿出来。

于 2012-05-31T15:01:11.277 回答
0

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

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

于 2012-05-31T14:41:01.363 回答