【问题标题】:C++, class with method and enum type - can method and enum value have same names?C ++,具有方法和枚举类型的类-方法和枚举值可以具有相同的名称吗?
【发布时间】:2013-05-16 05:07:37
【问题描述】:

我有以下课程:

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

【问题讨论】:

    标签: c++ class enums redefinition


    【解决方案1】:

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

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

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

    【讨论】:

    • 即使编译器可以区分它们,但人类必须弄清楚是哪一个是一个非常糟糕的主意。
    • 所有大写字母通常仅用于宏,以提醒注意名称遵守作用域,并且几乎可以做任何事情。
    • 是的,宏的全部大写,我见过使用全部大写的枚举(但与宏不同,它通常有一个前缀),但这只是命名约定。是的,名称和范围是任何编程语言的两个不同方面。我的意思不是这样吗?
    【解决方案2】:

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

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

    【讨论】:

    • 给函数取一个更有表现力的名字怎么样,比如openDoor
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2020-03-03
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多