具有方法和枚举类型的类——方法和枚举值可以有相同的名称

C++, class with method and enum type - can method and enum value have same names?

本文关键字:枚举 方法 类型 有方法      更新时间:2023-10-16

我有以下类:

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

类的问题是open名称被定义为类内部方法的名称和枚举类型的值。

问题是:我是否可以以某种方式修改代码,以便open名称在类内部工作,或者我是否应该为open()方法或open enum类型值选择其他名称?

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

在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中通过将enum放入class(因此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仍然可用,使用与以前相同的语法

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

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

不能在同一名称空间或作用域下使用相同名称的符号。编译器无法区分两者

这里的问题是编码约定。对于命名常量,我通常更喜欢使用大写字母,比如enums

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