C++,带有方法和枚举类型的类 - 方法和枚举值是否具有相同的名称?

col*_*mik 3 c++ enums class redefinition

我有以下课程:

class washm_t 
{
public:
    enum door_t { closed = 0, open = 1 };
private:
    door_t door_state ;
public:
    int open() ;
};
Run Code Online (Sandbox Code Playgroud)

该类的问题是该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 ;
}
Run Code Online (Sandbox Code Playgroud)

Pot*_*ter 6

在C++ 11中,您可以使用enum class:

enum class door_t { closed = 0, open = 1 };
Run Code Online (Sandbox Code Playgroud)

但是你必须提到door_t::open而不是简单open.这具有冗长的优点和缺点.enum class在这些可能存在名称冲突的情况下很好,并且它有效地为枚举的枚举器添加了通用前缀.

(实际上,在C++ 11中,您不需要使用class关键字.只需提及door_t::open解决冲突而无需其他更改.)

你可以在C++ 03中找到一个类似的解决方案,因为它enum内置一个class(因此是C++ 11特性的语法)

struct door_state {
    enum door_t { closed = 0, open = 1 };
};
Run Code Online (Sandbox Code Playgroud)

您可以将其设置为嵌套类,或者在之前定义它washm_t并将其用作基类

class washm_t : public door_state {
    int open();
};
Run Code Online (Sandbox Code Playgroud)

现在该成员open()重写了枚举器,但枚举器仍然可用door_state::open,并且closed仍然可以使用与以前相同的语法.