【问题标题】:How do I correctly use enum in this C++ example?如何在此 C++ 示例中正确使用枚举?
【发布时间】:2014-02-10 00:26:46
【问题描述】:

我有一个类似这样的类,声明了一个公共枚举:

// DataStorage.h
class DataStorage
{    
  enum ActionType { ADD, REMOVE };

  public :
    data();
    void update(ActionType action, Data dataItem);
};

然后我有一个 Main.cc 像这样使用它......

// Main.cc
#include "DataStorage.h"

int main() {
  DataStorage dataStorage;
  Data dataItem("abc123");
  dataStorage.update(ActionType.ADD, dataItem); <<-- error here
}

我的问题是编译时出现这个错误:

Main.cc:29:18: error: ‘ActionType’ was not declared in this scope

我做错了什么?枚举应该在哪里声明,我应该如何在 main 中使用它?

谢谢!

【问题讨论】:

  • ActionType 是 DataStorage 的一部分,不是全局的。
  • @chris 我是否将“枚举 ActionType...”移动到“class DataStorage”行上方以使其成为全局对象?这就是我让它工作所需的全部内容吗?

标签: c++ enums


【解决方案1】:

更新

dataStorage.update(ActionType.ADD, dataItem);  

到:

dataStorage.update(DataStorage::ADD, dataItem);  

注意:You need to make enum type ActionType public.

class DataStorage
{ 
public :   
    enum ActionType { ADD, REMOVE };

    data();
    void update(ActionType action, Data dataItem);
};

【讨论】:

  • 或DataStorage::ActionType::ADD,以防您将其声明为enum class 或使用MSVC 编译并且您不关心是否符合标准
  • 注意: ActionType 不是 public!
  • @Paranaix Thx,我是新手,所以如果你能告诉我这样做的正确“标准”方式是什么,那就太好了,谢谢!
  • @RobertHume 正如 billz 发布的那样。 enum 将其符号/值添加到封闭的命名空间中,并且不自行定义命名空间。因此,符号 (ADD & REMOVE) 位于 DataStorage 的命名空间中。这是完全正确的。然而,MSVC 添加了一个扩展,允许您威胁枚举,就像它们拥有自己的命名空间一样。在 c++11 中,这些扩展实际上变得非常无用,因为引入了 enum class,不仅为枚举提供了强类型,还为它们提供了自己的命名空间。
  • @Paranaix 这很好地解释了所有缺失的点:)!
【解决方案2】:

下面的代码应该可以工作(并且通过 c++ 标准完全没问题):

// DataStorage.h
class DataStorage
{    
  public :
    enum ActionType { ADD, REMOVE };

    data();
    void update(ActionType action, Data dataItem);
};

  dataStorage.update(DataStorage::ADD, dataItem);

如果您想使用 ActionType 标识符引用枚举值,请使用新的 enum class 功能(然后将解析为 DataStorage::ActionType::ADD)。

【讨论】:

  • 我想我让它像你的代码一样工作,但我不得不做dataStorage.update(DataStorage::ADD, dataItem);,这似乎是错误的,因为它应该是ActionType::ADD,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2013-02-11
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多