具有相同名称的枚举和类成员函数

voi*_*ter 3 c++ enums naming-conventions

在我的工作场所强制执行的特定编码标准中,类中的访问器方法遵循特定的命名约定。对于任何给定的成员变量,getter 是相同的名称,setter 以 为前缀Set。请参阅下面的示例。

class Foo
{
public:
    int Number() const { return m_number; }
    void SetNumber(int number) { m_number = number; }

private:
    int m_number;
};
Run Code Online (Sandbox Code Playgroud)

当我有一个同名的枚举时,这变得古怪:

enum class Number
{
    One, Two, Three
};

class Foo
{
public:
    Number Number() const { return m_number; }
    void SetNumber(Number number) { m_number = number; }

private:
    Number m_number;
};
Run Code Online (Sandbox Code Playgroud)

上面的例子不会编译,因为在某些地方,编译器无法确定我指的是枚举名称还是函数名称。所以为了在不违反编码标准的情况下解决这个问题,我必须::在不明确的地方使用,我实际上指的是枚举:

enum class Number
{
    One, Two, Three
};

class Foo
{
public:
    ::Number Number() const { return m_number; }
    void SetNumber(::Number number) { m_number = number; }

    void DoStuffWithNumber()
    {
        if (m_number == ::Number::One)
        {
            // Do stuff
        }
    }

private:
    Number m_number;
};
Run Code Online (Sandbox Code Playgroud)

这对代码的读者来说有点混乱,但在某些上下文中必须完全限定枚举名称也有点烦人。这并不总是直截了当的。

这里有什么更合理的解决方法?显然我可以做一些事情,比如将访问器重命名为GetNumber(),但我很想知道人们可以提出哪些其他解决方案。

zhm*_*zhm 6

您可以添加enum前缀以显式引用枚举类名,而不是函数名。

enum class Number
{
    One, Two, Three
};

class Foo
{
public:
    enum Number Number() const { return m_number; }
    void SetNumber(enum Number number) { m_number = number; }

private:
    enum Number m_number; // Number here refers to enum class, not function
};
Run Code Online (Sandbox Code Playgroud)

注意:以上代码在 g++ 下工作,但在 Visual Studio 中存在问题。VS 似乎不适用于范围枚举。我们可以使用无作用域的枚举(没有class关键字)来代替。