在敲c++的时候遇到一个问题:有的时候一些类需要定义枚举类型作为其成员。
看起来问题不大,但是作为初学者的我,加上自己想用多文件结构来实现,就开始发蒙了:
枚举元素本质上是常量,但是记得书上又写过,那些需要编译器分配内存的定义,不能写在头文件中!
于是写代码测试如下:
//myhead.h
class myclass {
public:
enum myenum;
void setcondition(myenum NewCondition);
void setcondition();
private:
myenum conditions;
};
//myhead.cpp
using namespace std;
enum myclass::myenum { condition1, condition2, condition3 };
void myclass::setcondition(myenum NewCondition) { conditions = NewCondition; }
void myclass::setcondition() { conditions = condition1; }
没报错,沾沾自喜。但是在主函数中调用setcondition时,出错了:
myclass myobj;
myobj.setcondition(condition1);
报错:: error C2065: “condition1”: 未声明的标识符
改成myclass::condition1,又报错: error C2039: "condition1": 不是 "myclass" 的成员
???我在myhead.cpp里定义了呀?
只好改成如下:
//myhead.h
class myclass {
public:
enum myenum { condition1, condition2, condition3 };//声明改成了这种形式
void setcondition(myenum NewCondition);
void setcondition();
private:
myenum conditions;
};
//myhead.cpp
using namespace std;
enum myclass::myenum { condition1, condition2, condition3 };
void myclass::setcondition(myenum NewCondition) { conditions = NewCondition; }
void myclass::setcondition() { conditions = condition1; }
很遗憾,又报错了:error C2011: “myclass::myenum”:“enum”类型重定义
??????????
我在myclass 里的是声明呀?!!!!
没办法,只能改成一开始极力避免的——
//myhead.h
class myclass {
public:
enum myenum { condition1, condition2, condition3 };//直接在头文件里定义
void setcondition(myenum NewCondition);
void setcondition();
private:
myenum conditions;
};
//myhead.cpp
using namespace std;
void myclass::setcondition(myenum NewCondition) { conditions = NewCondition; }
void myclass::setcondition() { conditions = condition1; }
直接在头文件里定义!!!
这下好,居然编译成功了!得出结论:定义枚举类型作为类的成员,可以直接在头文件里定义。
至于原因,我作为初学者,坐等大佬解答~
---------------------------------------------------------------------------------------------------------------------------------
P.S.:在解决这个问题的同时,我还发现了一个现象:(还是上面那段代码)对一个类的成员的枚举元素的使用,可以有两种形式:
myobj.setcondition(myclass::condition1);
//或
myobj.setcondition(myclass::myenum::condition1);
两种写法是等价的
原因也坐等大佬解答~
---------------------------------------------------------------------------------------------------------------------------------
P.S.:这是本人头一次写文章,望大家多多包涵,不喜轻喷~
==================================END====================================
本文讲述了在C++编程时遇到的关于类中枚举成员的定义问题。当尝试在头文件中定义枚举类型作为类的成员时,遇到了编译错误。经过一系列尝试,发现枚举成员必须在头文件中直接定义才能正确编译。同时,文中还提出了一个现象,即枚举元素在类的成员中可以有两种等价的使用方式,作者期待专业人士解答这些问题。
1590





