私の職場で実施される特定のコーディング標準では、クラス内のアクセサメソッドは特定の命名規則に従っています。与えられたメンバ変数については、ゲッタは同じ名前であり、セッタの前には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()
に変更するようなことができますが、人々が思いつく他の解決方法を知りたいのです。
ゲッターの名前を変更することはできません。それは職場のコーディング標準です。だから、列挙型の名前を複数形にするのはどうですか? –
getterのリグを取得して変換演算子(operator {Number(){return m_number;} ')を提供することについてはどう思いますか? – NathanOliver
@ NathanOliverそれほど直感的ではない、IMHO。私の個人的な好みは、私が明確でよく定義されたセマンティクス(コピー/移動操作、ストリーム、算術型など)を実装していない限り、演算子を避けることです。 –