2017-01-24 10 views
1

私の職場で実施される特定のコーディング標準では、クラス内のアクセサメソッドは特定の命名規則に従っています。与えられたメンバ変数については、ゲッタは同じ名前であり、セッタの前には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()に変更するようなことができますが、人々が思いつく他の解決方法を知りたいのです。

+0

ゲッターの名前を変更することはできません。それは職場のコーディング標準です。だから、列挙型の名前を複数形にするのはどうですか? –

+1

getterのリグを取得して変換演算子(operator {Number(){return m_number;} ')を提供することについてはどう思いますか? – NathanOliver

+0

@ NathanOliverそれほど直感的ではない、IMHO。私の個人的な好みは、私が明確でよく定義されたセマンティクス(コピー/移動操作、ストリーム、算術型など)を実装していない限り、演算子を避けることです。 –

答えて

2

接頭辞enumを追加して、関数名ではなく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 
}; 

注:上記のコードが++グラムの下で動作しますが、Visual Studioで問題があります。 VSはスコープ付きの列挙型ではうまく機能していないようです。代わりに、範囲指定されていない列挙型(classキーワードなし)を使用できます。

+1

実際に列挙子の1つを参照する必要がある場合は、このように見えます。私の最後のコードスニペットで、私は ':: Number :: One'をしているのを見るでしょう。 'enum Number :: One'を実行することはできません。 –

+0

@ void.pointer g ++で動作します。どのコンパイラを使用していますか? –

+0

VS 2015も試しましたか? –

1

は列挙いるので、私は、複数の、ここで使用する値の範囲をとることができます。

enum class Numbers 
//    ^
{ 
    One, Two, Three 
}; 

これは珍しい練習ではありません。あなたの列挙型の接頭辞を使用しないのはなぜ

enum UrlTableErrors { 
    kOK = 0, 
    kErrorOutOfMemory, 
    kErrorMalformedInput, 
}; 
enum AlternateUrlTableErrors { 
    OK = 0, 
    OUT_OF_MEMORY = 1, 
    MALFORMED_INPUT = 2, 
}; 
0

:例えば、Google C++ style guideに彼らは例の名前付け、次の列挙型を使用できますか?それはまた、あなたがここに列挙型ではなく、クラスや関数を扱っていることを迅速に識別するのに役立ちます

enum class ENumber 
{ 
    One, Two, Three 
}; 

この方法:あなたはメンバ変数のためのM_を使用するのと同様に、あなたはEとあなたの列挙型の前に付けることができます。

1

個人的には、大文字の小文字と静的(メンバー)関数のみを使用してメンバー関数を開始することをお勧めします。 実際のゲッターとセッター機能がある場合は、setNumbergetNumberのようなペアとしてマークすることをお勧めします。

だけでこのようなコードを見てになるだろう:私は、参照(またはconstの場合はconst参照)を返すだけnumberという名前の関数を経由してアクセスしてm_numberの場合には

enum class Number 
{ 
    One, Two, Three 
}; 

class Foo 
{ 
public: 
    Number getNumber() 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() { return m_number; } 
    const Number& number() const { return m_number; } 
private: 
    Number m_number; 
}; 

この場合、「名前付き関数」をすべて削除し、会話演算子を提供したい場合があります。

関連する問題