提问者:小点点

前向声明和全局命名空间声明


我有困难建立一个有3个类的结构。我不确定包含/转发声明。

下面的代码一直在编译,直到我在inclino.h中添加名称空间和枚举。我从Inclinomeasure.h收到“Inclino尚未声明”。

倾斜度。h

// Inclino.h
#include "InclinoMeasure.h"
#include "InclinoReading.h"

namespace inclino {
enum a{a1, a2}
}

class Inclino
{
    list<InclinoMeasure*> m_measures;

    void f(inclino::a a);
}

倾斜度

// InclinoMeasure.h
#include "InclinoReading.h"

class Inclino;

class InclinoMeasure
{
    Inclino *m_inclino;
    list<InclinoReading*> m_readings;

    void f(inclino::a a);
}

倾角读数.h

// InclinoReading.h

class Inclino;
class InclinoMeasure;

class InclinoReading
{
    InclinoMeasure *m_inclino;

    void f(inclino::a a);
}

结构正确吗?如何访问其他类中的枚举?

提前道谢。

编辑:我修复了名称空间的问题,把它放在一个新的文件,包括由3类。但我似乎误用了include/forward声明。


共1个答案

匿名用户

我从Inclinomeasure.h收到“Inclino尚未声明”。

这是因为名称空间inclino和枚举a当前是在inclino.h中定义的,但是inclino.h不包括inclino.h(鉴于标头之间的当前关系,也不应该包括inclino.h,因为这会引入循环依赖关系)。类clinkino的前向声明与命名空间和枚举无关。

若要解决此问题,可以将命名空间和枚举的定义移动到inclinoreading.h

这将使它在使用它的所有三个头中都可用,因为Inclino.hInclinoMeasure.h都包含InclinoReading.h