在c++中使用枚举类值调用数组元素

Using enumerated class values to call an array element in C++

本文关键字:值调用 数组元素 枚举 c++      更新时间:2023-10-16

我的代码:

Enumerations.h

#ifndef ENUMERATIONS_H
#define ENUMERATIONS_H
enum class Employees
{
    ERIC,
    RYAN,
    EMILY
};
#endif

Structs.h

struct Employee
{
    std::string name;
    double wage;
};

Review.cpp

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Enumerations.h"
#include "Structs.h"
Employee employeeArray[3];
    employeeArray[0] = { "Eric Sartor", 18.75 };
    employeeArray[1] = { "Ryan Ulch", 20.36 };
    employeeArray[2] = { "Emily Gover", 18.75 };
cout << employeeArray[Employees::RYAN].name;

所以我试图做一些我在我的c++教程中读到的东西,在那里你通过枚举值调用数组元素(结构体)。在本教程的前面,建议如果您的编译器兼容c++ 11(我的编译器是兼容的),那么最好使用枚举类而不是常规枚举。

我注意到,当试图通过Employees::RYAN枚举值从我的数组调用我的元素时,它给了我一个错误,说"表达式必须具有整数或无范围枚举类型"。如果我从枚举中删除class关键字,那么它只是enum Employees,我将数组索引更改为RYAN,它工作得很好。是我遗漏了什么,还是这对枚举类不起作用?

希望我说得够清楚了。在教程的例子中,他实际上并没有使用枚举类,只是一个常规的枚举,尽管他之前明确地说过,如果可以的话,总是这样做……希望有人能为我澄清这一点!

具有enum-keyclassstruct的枚举是范围的枚举。有作用域的枚举没有到int的隐式转换。

通过整型提升(4.5)将枚举数或无作用域枚举类型的对象的值转换为整数。(例子:

enum color { red, yellow, green=20, blue };
color col = red;
color* cp = &col;
if (*cp == blue) // ...

使color成为描述各种颜色的类型,然后声明col为该类型的对象,cp为指向该类型对象的指针。类型为color的对象可能取值为:red, yellow, greenblue;这些值可以转换为整数值012021。由于枚举是不同的类型,color类型的对象只能被分配color类型的值。

color c = 1; // error: type mismatch,
// no conversion from int to color
int i = yellow; // OK: yellow converted to integral value 1
// integral promotion

注意,这种隐式的enumint的转换不提供给作用域枚举:

enum class Col { red, yellow, green };
int x = Col::red; // error: no Col to int conversion
Col y = Col::red;
if (y) { } // error: no Col to bool conversion

可以显式地将枚举数强制转换为int:

cout << employeeArray[static_cast<int>(Employees::RYAN)].name;

选自c++标准(5.2.1下标)

1后接方括号中的表达式为后缀表达式。其中一种表述形式为"T的数组"或"指向T的指针"以及其他类型的都没有作用域枚举或整型....

没有从作用域枚举到整型的隐式转换。

如果你想使用作用域枚举作为索引,你必须显式地将其转换为某种整型。例如

cout << employeeArray[static_cast<int>( Employees::RYAN )].name;