28

C++ でメンバー変数と関数パラメーターの両方に同じ名前を使用するのが良い方法かどうか疑問に思っています。

私はこれが一般的だったJavaの背景から来ました。C ++で次のことを行うのに欠点があるかどうか疑問に思っています(コードは機能します):

class Player
{
    public:
    void setState(PlayerState *state)
    {
        this->state = state;
    }

    private:
       PlayerState *state;
}

回答ありがとうございます。機能している間に私が理解しているように、メンバー変数と関数パラメーターを区別するために、次のようなマーカーを配置することをお勧めします。

 _ or m_

一部のエディター (Qt Designer など) では、メンバー変数が別の色で表示されます。これが、プレフィックスを追加する必要がないように思われた理由です。

4

9 に答える 9

19

それは正しく、標準で許可されています。しかし、より良いアプローチは、メンバー変数に何らかの命名規則を使用することです。たとえば、m_すべてのメンバー変数にプレフィックスを使用すると、誰でも何が何でm_stateあるかを推測できます。コードの可読性が向上し、よくある間違いを回避できます。

また、m_stateがメンバーの場合、メンバー関数に記述する必要はなく、 と書くthis->m_state = stateだけで済みますm_state = state。現在のコードでは、this->一部が必要になり、それがなければstate = state自己割り当てになります。

于 2012-04-20T16:34:20.757 に答える
9

通常、人々は変数の後にアンダースコアを置くか、関数パラメーターに短い説明の少ない var 名を使用します。

個人的には同名のものは読み間違えやすいので嫌いです。

于 2012-04-20T16:34:27.453 に答える
4

メンバー変数にコンストラクターの初期化パラメーターと同じ名前を付けるのは良い選択だと思います。

ここに私の理由があります:

  • 識別子の数が減るため、複雑さが軽減されます
  • それほど多くの識別子を発明する必要はありません
  • 可能であれば、同じものは同じ名前にする必要があります。論理的に言えば、私は知っています
    parameter != member
  • コンテキストとインデックスにより、同じものに同じ名前を付けることができます
  • すべての参照が同じ名前を持っている場合、検索によって論理的なものへの参照 (識別子) をより簡単に見つけることができます。
于 2014-06-16T08:46:03.447 に答える
3

C++ と Java の間に実際の違いはありません。唯一の欠点は、this->state = state代わりに型を入力する必要があることですstate = arg

しかし、あなたのコードは完全に受け入れられます。それは何よりもスタイリングです。

于 2012-04-20T16:35:17.723 に答える
1

これは何よりもスタイルの問題です。ほとんどの場合、問題はありません。state変数や値は修飾名詞でなければならないため、変数や値の名前としては非常に不適切です。たとえば、次のようになります。

void setState( PlayerState* newState )
{
    currentState = newState;
}

とにかく、理論的には。実際には、次のように接頭辞を使用すると便利であることがわかりました。

class Player
{
    PlayerState* myState;
public:
    void setState( PlayerState* newState )
    {
        myState = newState;
    }
};

コードを読むと、名前が で始まる場合はmy明らかにメンバ変数です (で始まる場合ourは静的メンバ変数です)。

コンストラクターでは、次のようなことができることにも注意してください。

Player::Player( PlayerState* state )
    : state( state )
{
}

ただし、これが読みやすさのために何をするのかはわかりません。

Player::Player( PlayerState* initialState )
    : myState( initialState )
{
}

はるかに明確に見えます (ただし、単純なデータ所有者にとっては、違いはそれほど重要ではないかもしれません)。

于 2012-04-20T17:24:52.623 に答える
1

コーディング スタイルの規則に従うことをお勧めします。個人的に私は以下を使用します:

class Player
{
    public:
    void setState(PlayerState *state)
    {
        _state = state;
    }

    private:
       PlayerState* _state;
}
于 2012-04-20T16:34:20.370 に答える
1

一部のコンパイラ ( vs 2015 ) は、変数が別の変数をシャドウする場合に警告を生成する場合があることに注意してください。もちろん、この種の警告を無効にすることもできます。しかし、これらのチェックを有効にすることは良い習慣だと思います。

于 2017-07-14T08:50:55.607 に答える
0

このようにしてください:

class Player
{
    public:
    void setState(PlayerState *state)
    {
        this->m_state = state;
    }

    private:
       PlayerState *m_state;
}

後ほどよろしくお願いします。ハハ.. (:

"m_" ("Member") プレフィックスは、メンバーを関数やその他のものと区別します。インテリセンス (またはその他の IDE 自動提案) などで非常に便利です。

また、後で変更するつもりがないかのようにマークm_stateします。const念のため。

于 2012-04-20T16:41:24.377 に答える
0

実際、コンストラクター内にのみある限り、それは良い形でさえあるかもしれません。

于 2012-04-20T16:34:35.373 に答える