C++:如何在类外部使用类内部定义的枚举类型
解决类内枚举外部访问的问题
你遇到的问题核心是类成员枚举的作用域问题:你在Stepper类内部定义的枚举microstepping以及它的枚举值FULL、HALF、QUARTER,都属于类的作用域范围,在类外部直接使用这些枚举值时,编译器无法识别它们属于哪个类,所以会报错。
最简单的解决方法:用类名限定枚举值
直接在枚举值前加上类名Stepper::来指定作用域,修改你的main函数即可:
void main() { Stepper stepperA(Stepper::FULL); // 通过类名限定访问枚举成员 }
可选优化:简化枚举的访问方式
如果你觉得每次写Stepper::太繁琐,可以在类定义之后用using(C++11及以上版本支持)来给类内的枚举类型起一个外部可用的别名:
class Stepper { public: enum microstepping { FULL, HALF, QUARTER }; int stepsPerStep; Stepper(microstepping _microstepping) { switch(_microstepping){ case FULL: stepsPerStep = 1; break; case HALF: stepsPerStep = 2; break; case QUARTER: stepsPerStep = 4; break; } } }; // 给类内枚举起别名,方便外部使用 using StepperMicrostep = Stepper::microstepping; void main() { Stepper stepperA(StepperMicrostep::FULL); }
进阶方案:使用强类型枚举(C++11+)
如果想要更强的类型安全性,可以把枚举改成enum class(强类型枚举),它的访问规则和普通成员枚举类似,但不会隐式转换为整数,类型更严谨:
class Stepper { public: enum class microstepping { FULL, HALF, QUARTER }; int stepsPerStep; Stepper(microstepping _microstepping) { switch(_microstepping){ case microstepping::FULL: stepsPerStep = 1; break; case microstepping::HALF: stepsPerStep = 2; break; case microstepping::QUARTER: stepsPerStep = 4; break; } } }; void main() { // 强类型枚举需要同时指定类名和枚举类型名 Stepper stepperA(Stepper::microstepping::FULL); }
以上几种方法都不需要把枚举移到类外部,完美符合你的需求。
内容的提问来源于stack exchange,提问作者nosknut
相关产品推荐
相关产品推荐

