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

时间:2016-05-30 23:39:47

标签: c++ namespaces include forward-declaration

我很难设置一个包含3个类的结构。我不确定包含/转发声明。

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

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

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

class Inclino;

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

    void f(inclino::a a);
}

InclinoReading.h

// InclinoReading.h

class Inclino;
class InclinoMeasure;

class InclinoReading
{
    InclinoMeasure *m_inclino;

    void f(inclino::a a);
}

结构是否正确?如何在其他课程中访问枚举?

提前致谢。

编辑:我通过将其置于包含3个类的新文件中来修复名称空间问题。但似乎我误用了包含/转发声明。

1 个答案:

答案 0 :(得分:1)

  

我从InclinoMeasure.h收到“inclino尚未声明”

这是因为名称空间inclino和枚举a目前在Inclino.h中定义,但InclinoMeasure.h不包含Inclino.h(并且不应该,标题之间的当前关系,因为这将引入循环依赖)。 class Inclino的前向声明与命名空间和枚举无关。

要解决此问题,您可以将命名空间和枚举的定义移至InclinoReading.h

这将使其在所有三个标题中都可用,因为Inclino.hInclinoMeasure.h都包含InclinoReading.h