3

我有以下课程:

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 ;
}
4

3 回答 3

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解决冲突,无需其他更改。)

您可以在 C++03 中通过在 a 中添加一个类似的解决方案enumclass因此是 C++11 功能的语法)

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仍可使用与以前相同的语法。

于 2013-05-21T12:29:39.377 回答
2

如何将枚举大写,或者给它们一个合理的前缀?

enum door_t { CLOSED = 0, OPEN = 1 };

enum door_t { door_closed = 0, door_open = 1 };
于 2013-05-21T12:29:15.533 回答
0

您不能在同一个名称空间或范围内拥有同名的符号。编译器无法区分两者。

这里的问题在于编码约定。我通常更喜欢使用大写字母来命名常量,如枚举

enum door_t { CLOSED = 0, OPEN = 1 };
于 2013-05-21T12:28:02.930 回答