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(),但我很想知道人们可以提出哪些其他解决方案。
您可以添加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关键字)来代替。
| 归档时间: |
|
| 查看次数: |
2022 次 |
| 最近记录: |