我有以下课程:
class washm_t
{
public:
enum door_t { closed = 0, open = 1 };
private:
door_t door_state ;
public:
int open() ;
};
该类的问题是open
名称被定义为类内部方法的名称和枚举类型的值。
问题是:我可以以某种方式修改代码,以便两个open
名称在类内部工作,或者我应该为open()
方法或open
选择其他名称吗?枚举类型值?
这就是open()
函数的样子:
int washm_t::open()
{
if(door_state == open) // ~fails, 'open' interpreted as name of method
// not as name of enum type value
return 1 ;
else
return door_state = open, 0 ;
}
答案 0 :(得分:6)
在C ++ 11中,您可以使用enum class
:
enum class door_t { closed = 0, open = 1 };
但是你必须引用door_t::open
而不是open
。这具有冗长的优点和缺点。 enum class
在这些可能存在名称冲突的情况下表现良好,并且它有效地为枚举的枚举器添加了通用前缀。
(实际上,在C ++ 11中,您不需要使用class
关键字。只需引用door_t::open
就可以解决冲突而无需其他更改。)
通过在enum
中放置class
(因此是C ++ 11特性的语法),您可以在C ++ 03中找到类似的解决方案
struct door_state {
enum door_t { closed = 0, open = 1 };
};
您可以将其设为嵌套类,或在washm_t
之前定义它并将其用作基类
class washm_t : public door_state {
int open();
};
现在,成员open()
会覆盖枚举数,但枚举数仍然可用door_state::open
,closed
仍然可以使用与之前相同的语法。
答案 1 :(得分:2)
如何大写枚举,或给他们一个合理的前缀?
enum door_t { CLOSED = 0, OPEN = 1 };
enum door_t { door_closed = 0, door_open = 1 };
答案 2 :(得分:0)
您不能在同一名称空间或作用域下使用相同名称的符号。编译器无法区分彼此。
这里的问题是编码惯例。我通常更喜欢使用大写字母作为命名常量,如枚举
enum door_t { CLOSED = 0, OPEN = 1 };