C++ C++;,具有方法和枚举类型的类-方法和枚举值是否可以具有相同的名称?
我有以下课程:C++ C++;,具有方法和枚举类型的类-方法和枚举值是否可以具有相同的名称?,c++,class,enums,redefinition,C++,Class,Enums,Redefinition,我有以下课程: class washm_t { public: enum door_t { closed = 0, open = 1 }; private: door_t door_state ; public: int open() ; }; 该类的问题是,open名称被定义为类内方法的名称和枚举类型的值 问题是:我是否可以以某种方式修改代码,使open名称都在类内部工作,还是应该为open()方法或open枚举类型值选择其他名称 这就是open()函数的外观: i
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 ;
}
同一命名空间或作用域下不能有同名的符号。编译器无法区分两者 这里的问题在于编码约定。我通常更喜欢用大写字母来表示枚举之类的命名常量
enum door_t { CLOSED = 0, OPEN = 1 };
让枚举大写,或者给它们一个合理的前缀如何
enum door_t { CLOSED = 0, OPEN = 1 };
enum door_t { door_closed = 0, door_open = 1 };
在C++11中,可以使用
enum类
:
enum class door_t { closed = 0, open = 1 };
但是你必须参考door\u t::open
,而不是简单的open
。这有冗长的优点和缺点enum类
在可能发生名称冲突的情况下很好,它有效地为枚举的枚举数添加了通用前缀
(实际上,在C++11中,您不需要使用class
关键字。只需引用door\t::open
即可解决冲突,无需其他更改。)
在C++03中,您可以通过将enum
放在类
中来获得类似的解决方案(因此C++11特性的语法)
您可以将其设置为嵌套类,或者在washm\t
之前定义它并将其用作基类
class washm_t : public door_state {
int open();
};
现在,成员
open()
覆盖枚举器,但枚举器仍然可用作door\u state::open
,并且closed
仍然可用,使用与以前相同的语法。即使编译器可以区分它们,对于人类来说,必须弄清楚这是什么意思是一个相当糟糕的想法。所有大写通常只用于宏,以提醒人们注意这个名称不符合范围,几乎可以做任何事情。是的,所有大写用于宏,我见过使用所有大写的枚举(但与宏不同,它通常有前缀),但这只是命名惯例。是的,名称和范围是任何编程语言的两个不同方面。我的意思不是这样吗?给函数一个更具表现力的名称,比如openDoor
?
class washm_t : public door_state {
int open();
};