在我的工作场所执行的特定编码标准中,类中的访问器方法遵循特定的命名约定。对于任何给定的成员变量,getter的名称相同,而setter的前缀为Set
。请参见下面的示例。
class Foo
{
public:
int Number() const { return m_number; }
void SetNumber(int number) { m_number = number; }
private:
int m_number;
};
当我有一个同名的枚举时,这变得古怪:
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;
};
上面的示例将无法编译,因为在某些地方,编译器无法确定我是指的是枚举名称还是函数名称。因此,要在不违反编码标准的情况下解决此问题,就必须::
在模棱两可的地方使用,而实际上是指枚举:
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;
};
这对于代码的读者来说有些混乱,但是在某些情况下必须完全限定枚举名称也有些烦人。并非总是如此。
这里有什么更合理的解决方法?显然,我可以做一些类似将访问器重命名为的操作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
};
注意:上面的代码在g ++下可以工作,但是在Visual Studio中有问题。VS似乎不适用于范围枚举。我们可以使用无作用域枚举(无
class
关键字)来代替。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句