【问题标题】:enum and struct call枚举和结构调用
【发布时间】:2016-08-16 19:23:56
【问题描述】:

我有一个名为 Status.h 的头文件,如下所示:

enum State {
    OFFLINE = 0,
    ONLINE = 1,
    ...
};

struct AgentStatus {
    State statusInfo;
...
};

在我的 .cpp 文件中,我想初始化这个结构,设置状态,并每 10 秒调用一次以查找状态。这是我的尝试:

AgentStatus s1;
s1.statusInfo = 0;
while(1){
    std::cout<<"scanner status = "<<s1.statusInfo<<std::endl;
    usleep(1000000);
}

我得到的错误是这样的:

error: invalid conversion from ‘int’ to ‘State’ [fpermissive]
 s1.statusInfo = 0;

如何将我的结构设置为状态枚举中的这些值之一?

【问题讨论】:

  • 你定义了一个枚举。你为什么不写s1.statusInfo = OFFLINE; 而不是s1.statusInfo = 0;?就 C++ 编译器而言,您已经定义了具有特定值(枚举值)的类型,并且它希望您使用它们。这就是枚举的工作原理。
  • 你必须使用 static_cast
  • 为什么要定义一个只包含一个元素的结构?你是否对结构着迷?只需使用翻转的标量状态!

标签: c++ struct enums compiler-errors initialization


【解决方案1】:

您可以将State 隐式转换为数字,但不能将数字隐式转换为State

试一试

s1.statusInfo = OFFLINE;

s1.statusInfo = static_cast<State>(0);

【讨论】:

    【解决方案2】:

    你已经定义了:

    enum State {
        OFFLINE = 0,
        ONLINE = 1,
        ...
    };
    

    但你会这样做:

    s1.statusInfo = 0;
    

    这需要强制转换,但您可以/应该(可读性、维护性..)通过这样做来避免它:

    s1.statusInfo = OFFLINE;
    

    小例子:

    enum State {
        OFFLINE = 0,
        ONLINE = 1,
    };
    
    struct AgentStatus {
        State statusInfo;
    };
    
    int main() {
        AgentStatus s1;
        s1.statusInfo = OFFLINE;
        return 0;
    }
    

    编译:

    C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
    C02QT2UBFVH6-lm:~ gsamaras$ 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2016-11-26
      • 2015-09-23
      • 2019-02-07
      相关资源
      最近更新 更多