【问题标题】:Forward declaration and global namespace declaration前向声明和全局命名空间声明
【发布时间】:2016-05-30 23:39:46
【问题描述】:

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

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

倾斜.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);
}

倾斜测量.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 个类的新文件中来修复它。但似乎我滥用了包含/前向声明。

【问题讨论】:

    标签: c++ namespaces include forward-declaration


    【解决方案1】:

    我从 InclinoMeasure.h 收到“尚未声明倾斜度”

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

    要解决这个问题,可以把命名空间和枚举的定义移到InclinoReading.h

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

    【讨论】:

    • 谢谢,它适用于枚举,但我有来自 InclinoMeasure.cpp 的“无效使用不完整类型 'class Inclino'”(当我调用 Inclino 方法时)。我认为我的问题更多是关于前向声明。
    • 您是否将Inclino.h 包含在InclinoMeasure.cpp 中?如果不是,这可能会导致error: invalid use of incomplete type 'class Inclino'。另外,你应该确保你的头文件中有头文件保护;否则,在InclinoMeasure.cpp 中包含Inclino.h 后,您可能会遇到error: redefinition of 'class InclinoMeasure'
    • 如果我包含 2 个文件 + 每个类文件的 2 个前向声明,一切似乎都很好。该程序按预期工作,但它是一个好的代码吗? (是的,我有头卫)。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 2012-12-15
    • 1970-01-01
    • 2011-03-02
    • 2013-08-16
    • 2015-03-29
    • 2013-08-12
    • 2012-12-27
    相关资源
    最近更新 更多