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

时间:2013-05-21 12:21:36

标签: 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()函数的样子:

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

3 个答案:

答案 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::openclosed仍然可以使用与之前相同的语法。

答案 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 };