2016-07-13 8 views
4

を格納するクラス変数対静的関数の変数を使用すると、私はこのような機能を持っているとしましょう:いくつかの状態

void processElement() { 
    doSomething(someArray[lastProcessedElement + 1]); 
} 

事は、この関数が呼び出されるたびに、私は店に私が呼ばれる最後の要素が必要であり、 doSomething on。だからここに私は2つの選択肢があります。

  • 私はlastProcessedElementという名前のプライベートクラス変数を作成し、その関数が呼び出されるたびに値だインクリメントすることができます。このアプローチは最も一般的です。コードはこのようなものになることができるように:

    class Foo { 
        int lastProcessedElement = 0;  
    
        public: 
        void processElement() { 
         doSomething(someArray[++lastProcessedElement]); 
        } 
    } 
    
  • 目のオプションとして、私は、関数内で静的変数を作成し、そのたびにインクリメントすることができます

    // Class is not important here, so the function is: 
    void processElement() { 
        static int lastProcessedElement = 0; 
        doSomething(someArray[++lastProcessedElement]); 
    } 
    

は最初のソリューションが追加されます私はほしくない少し複雑さ。私は物事をその場で保つのが好きです。

私は2番目の解決策は、そのクラスが1つのインスタンスしか持たない場合にのみ動作することを知っています。

静的変数メソッドを使用するのは良い解決策ですか?そして、マルチインスタンスクラスのインラインソリューションはありますか? (この特定の配列要素インデックスの事柄に対する解決策があるかもしれませんが、私はそれを作成しました、関数の次の呼び出しのための値を格納することを話しています)

+0

'lastProcessedElement'を' processElement'に渡すこともできます。 – erip

+0

呼び出し元が処理する要素がわからないとしましょう。 – isamert

答えて

5

関数スコープ静的は悪い考えです:そのクラスは悪い設計上の制限です唯一のインスタンス

を持っている場合

にのみ機能します。

通常のクラスメンバー変数として状態を保持してください。

+0

ですが、必要なときはいつでもこのオブジェクトを運ぶことが必須です。 –

+0

@HumamHelfawi:どういう意味ですか?それが "必要"であれば、もちろんそれは必須です。 –

+0

それで、あなたは、これに対してインラインで解決策がないと言っています。 1つのインスタンス化された静的な変数のソリューション(私は、クラスが確かに1つだけのインスタンスを持っていることを知っている場合)を使用してどうですか?この状況には他にも落とし穴がありますか? – isamert

関連する問題