如何在 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<Sex>(sexChar);
并没有按照你的想法去做。没有将字符串(或字符)转换为枚举的内置方法。 (有关如何完成,请参阅其他答案。)
相反,此行将sexChar
视为一个数值,并使用该数值创建一个Sex
。 static_cast<Sex>(0)
会给你M
,static_cast<Sex>(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 接口一起使用