【问题标题】:Enum in header files头文件中的枚举
【发布时间】:2012-03-02 12:04:26
【问题描述】:

我在名为“sm.h”的头文件中声明了枚举

enum GameStates
{
  STATE_NULL = 0,
  STATE_INTRO,
  STATE_TITLE,
  STATE_MAIN,
  STATE_EXIT
};

它所做的只是列出可能的游戏状态

但是在“base.cpp”的以下行中:

stateID = STATE_INTRO;

编译器说“STATE_INTRO 没有在这个范围内声明”。我不知道我做错了什么。我知道我已经正确包含了头文件,我可以从 .cpp 文件转到它的减速。那么为什么我会收到这个错误。

stateID = STATE_INTRO;

用于:

bool baseFunctions::load_rc()
{
 stateID = STATE_INTRO;

 currentState = new Intro();

 return true;
}

在头文件中定义了一个类函数。

没有全局冲突,因为它是整个程序中唯一的枚举

【问题讨论】:

  • 它们是否在同一个命名空间中?
  • 我没有使用名称空间。我需要命名空间吗
  • 如果您可以发布更完整的代码将会很有用。这些部分本身似乎并没有错,因此您的代码中的不同级别一定有问题。
  • 对不起,应该更明确。这里的很多人都是非常优秀的程序员,他们可以编写 6 行代码并弄清楚,嘿,你在全局命名空间中遇到了冲突或类似的爵士乐。但是对于我们这些普通人来说,我们通常喜欢拥有可编译、可测试的代码,这样我们就可以戳它并刺激它,直到它工作为止。至少您可能希望提供包含枚举声明和load_rc() 函数的标头。
  • 对不起,我将添加所有base.cpp,base.h,sm.cpp,cm.h

标签: c++ enums header scope


【解决方案1】:

从您的文件链接中,您在sm.h 和base.h 中都有以下内容

#ifndef BASE_H_INCLUDED
#define BASE_H_INCLUDED

将sm.h 中的那个改成类似

#ifndef SM_H_INCLUDED
#define SM_H_INCLUDED

我希望你会没事的。

事实上,base.cpp 加载 base.h,然后当它到达 sm.h 时,#ifndef 为 false,因此它排除了 sm.h 中的所有内容。

【讨论】:

  • 没问题。如果您的编译器支持#pragma once,您可以使用它来代替您的#ifndefs。不过,代码的可移植性会降低。
【解决方案2】:

很可能是您没有在 base.cpp 中包含“sm.h”

【讨论】:

  • sm.h 包含在 base.cpp 和 base.h 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多