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();
};