C++_CH17_枚举
1.1 定义
枚举(ENUM),是enumeration的缩写。是为了让一组数值集合成为一种类型。
1.2一个例子
#include <iostream>
enum Example
{
A,B,C;//说明你想让哪些数成为组合,默认第一个为0,之后每一个加1
};
int a = 0;
int b = 1;
int c = 2;
//此时Example类型就只能赋这三个值
int main()
{
Example val = 10;//这样会报错
}
枚举就是规定一个类型,这个类型是一些整数的集合。如果定义一个这个类型的变量,则这个变量的值只能在这一整数集合里取。
当然A、B、C的取值可以不是默认的这几个,可以自己赋值
#include <iostream>
enum Example
{
A = 10,B = 100,C = 1000;//说明你想让哪些数成为组合,默认第一个为0,之后每一个加1//如果B、C不赋值,则默认是A的基础上加1.
};
int a = 0;
int b = 1;
int c = 2;
//此时Example类型就只能赋这三个值
int main()
{
Example val = 10;//这样会报错
}
另外,还可以给enum规定一些整数簇,以节约内存的使用:
#include <iostream>
enum Example: unsigned char //从32位变为8位
{
A = 10,B = 100,C = 1000;//说明你想让哪些数成为组合,默认第一个为0,之后每一个加1//如果B、C不赋值,则默认是A的基础上加1.
};
int a = 0;
int b = 1;
int c = 2;
//此时Example类型就只能赋这三个值
int main()
{
Example val = 10;//这样会报错
}
整数簇有哪些:
数据归类
注意必须是整数簇,浮点簇就不行:
#include <iostream>
enum Example: float //报错
{
A = 10,B = 100,C = 1000;//说明你想让哪些数成为组合,默认第一个为0,之后每一个加1//如果B、C不赋值,则默认是A的基础上加1.
};
int a = 0;
int b = 1;
int c = 2;
//此时Example类型就只能赋这三个值
int main()
{
Example val = 10;//这样会报错
}
1.3 用enum给之前的日志类升级
之前我们有一个日志类:
#include<iostream>
class Log
{
public:
const int LogLevelWarn = 0;
const int LogLevelTrace = 1;
const int LogLevelError = 2; //这一段就特别适合用enum
private://定义私有的一个变量,保存我们想要的log的level
int m_LogLevel = LogLevelError;//默认定义为2
public:
void SetLevel(int level)
{
m_LogLevel = level;//把外部我们给的level给m_LogLevel,对本来的2进行了修改
}
void warn(const char* message)
{
if(m_LogLevel >= LogLevelWarn)
{
std::cout<<"<WARN>"<<std::endl;
}
}
void trace(const char* message)
{
if(m_LogLevel >= LogLevelTrace)
{
std::cout<<"<TRACE>"<<message<<std::endl;
}
}
void error(const char* message)
{
if(m_LogLevel >= LogLevelError)
{
std::cout<<"<ERROR>"<<message<<std::endl;
}
}
};
int main()
{
Log log; //创建一个Log类型的instance名字叫log‘
log.SetLevel(log.LogLevelError);//使用log里的SetLevel方法,让我们输入希望展示的level层级,修改这里的参数,填入我们想要的层级。
log.warn("Hello");//warn层级
log.trace("Hello"); //追踪层级
log.error("Hello"); //错误层级
}
用enum升级:
#include<iostream>
class Log
{
public:
enum LEVEL
{
levelWARN = 0, levelTRACE, levelERROR // 枚举类型命名更清晰
};
private:
LEVEL m_LogLevel = levelERROR; // 使用枚举类型别名
public:
void SetLevel(LEVEL level)
{
m_LogLevel = level;
}
void warn(const char* message)
{
if(m_LogLevel <= levelWARN) // 修正条件检查,确保级别足够低
{
std::cout<<"<WARN> "<<message<<std::endl; // 输出消息
}
}
void trace(const char* message)
{
if(m_LogLevel <= levelTRACE) // 同上
{
std::cout<<"<TRACE> "<<message<<std::endl; // 输出消息
}
}
void error(const char* message)
{
if(m_LogLevel <= levelERROR) // 同上
{
std::cout<<"<ERROR> "<<message<<std::endl; // 输出消息
}
}
};
int main()
{
Log log; // 创建Log实例
log.SetLevel(Log::levelERROR); // 修正SetLevel的参数使用
log.warn("Hello");
log.trace("Hello");
log.error("Hello");
return 0; // 添加返回值
}
output:
Hello