如何在 c++ 中将枚举与函数一起使用?

Posted

技术标签:

【中文标题】如何在 c++ 中将枚举与函数一起使用?【英文标题】:How do I use enums with functions in c++? 【发布时间】:2020-09-11 22:50:17 【问题描述】:

我正在尝试编写一个函数 GetSex(),它设置一个枚举值 Sex,并使用来自外部 .txt 文件的值将其打印到 C++ 控制台,但由于出现各种编译错误语法不正确。

我这里有什么问题?

代码:

Sex GetSex(fstream&); //function prototype
enum Sex M, F; 

int main()

    fstream inStream("InputText.txt"); //create fstream object
    Sex mySex;  // create enum object
    mySex = GetSex(inStream); 
    cout << "Sex of first person is " << mySex;
    return 0;


Sex GetSex(fstream& inStream)

   //read in next letter in file
    char sexChar;
    inStream.get(sexChar);

    // set enum from char
    Sex mySex = static_cast<Sex>(sexChar);
    return mySex;

InputText.txt 包含一个单独的字符,每个字符都在一个新的行中表示一个人的性别:

M
F
M
F

错误:

错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

(10,5):错误 C2146:语法错误:缺少 ';'在标识符“GetSex”之前

(21,9):错误 C2146:语法错误:缺少 ';'在标识符“mySex”之前

(21,9): 错误 C2065: 'mySex': 未声明的标识符

(22,5): 错误 C2065: 'mySex': 未声明的标识符

(22,13)​​:错误 C3861:“GetSex”:找不到标识符

(23,42): 错误 C2065: 'mySex': 未声明的标识符

(42,11):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

(42,1): 错误 C2086: 'int Sex': 重新定义

(10): 消息:见“性”声明

(42,5):错误 C2146:语法错误:缺少 ';'在标识符“GetSex”之前

(43,1):错误 C2143:语法错误:缺少 ';'在''之前

(43,1): 错误 C2447: '': 缺少函数头(旧式正式列表?)

【问题讨论】:

您应该将遇到的错误添加到问题中。 【参考方案1】:

您必须编写某种转换函数。 比如:

std::optional<Sex> CharToSex(char c) 
    switch (c) 
        case 'M':
        case 'm':
            return Sex::M;
        case 'F':
        case 'f': 
            return Sex::F;
        default:
            return std::nullopt;
    

如果你不喜欢std::optional,那么你可以使用异常来代替。

您还必须在使用 CharToSex 的地方声明它,但这与您的问题无关。

您的编译器错误具体是由于 GetSex() 中不知道 Sex

只需交换枚举定义和函数声明即可。

【讨论】:

CharToSex 与问题无关。但是我回复的最后两行是。【参考方案2】:

enum Sex M, F; 移到函数声明上方,并添加缺少的包含和using namespace std; 后,我没有收到任何错误。

但是,Sex mySex = static_cast&lt;Sex&gt;(sexChar); 并没有按照你的想法去做。没有将字符串(或字符)转换为枚举的内置方法。 (有关如何完成,请参阅其他答案。)

相反,此行将sexChar 视为一个数值,并使用该数值创建一个Sexstatic_cast&lt;Sex&gt;(0) 会给你Mstatic_cast&lt;Sex&gt;(1) 会给你F。将任何其他数字转换为 Sex 会导致未定义的行为。 (在某些情况下,允许将数字转换为枚举,即使它没有具有该值的常量,但它不适用于此处;您可以在 cppreference 找到更多详细信息。

【讨论】:

谢谢。因此,如果我想读取该字符并设置枚举,最好的方法是按照@JohnkaS 的建议编写转换函数? @Reno 是的,类似的。【参考方案3】:

替换:

Sex GetSex(fstream&);
enum Sex  M, F ;

在:

enum Sex  M, F ;
Sex GetSex(fstream&);

【讨论】:

以上是关于如何在 c++ 中将枚举与函数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 C++ 中将返回值移动语义与受保护的复制构造函数一起使用?

如何在 C# 中将 DLLImport 与结构一起用作参数?

如何在 Kotlin 中将函数接收器类型与 SAM 接口一起使用

在 C++ 中将 memset 与多维数组一起使用

如何在 SQL 中将 CASE 表达式与 SUM 函数一起使用?

如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?