2010-12-29 20 views
8

私に迷惑をかけるようなものがあります。メソッドの静的なローカル変数は悪い習慣ですか?

スレッドされていないプログラムでは、ローカル静的変数(メソッド内)または静的クラスメンバーを持つ方が良いでしょうか?この例では

class C{ 
public: 
    C(){}; 
    void foo(); 
}; 

void C::foo(){ 
    static int bar = 0; 
    bar++; 
    printf("%d\n",bar); 
} 

barが単独C::foo()で使用される場合、それは悪い習慣と考えられますか?

答えて

7

いずれも優れていません。それらは非常に異なるユースケースに対応します

+4

あなたの答えの始まりは有望だと思われますが、あなたは精巧にできますか? –

+12

@IIyan、彼のコードのセマンティクスは "何回fooが呼び出されたかを表示します!"です。彼の質問で見ることができるものから、これはクラスの状態とは何の関係もないので、静的なクラスメンバとして変数を置くのは間違っているでしょう。しかし 'foo'は、コピーコンストラクタだろうと' bar'は 'numberOfCopies'と呼ばれることになるならば、それは静的クラスのメンバのための良い候補だろう。それはそれがどのように使用されるかによって異なります。 –

0

オブジェクト指向のバーは、クラスCの状態の一部です。これは、通常、静的ローカル変数ではなくフィールドを使用する方が好きな理由です。

+0

どのオブジェクトの状態ですか?グローバル変数(この例では静的)はオブジェクトの状態の一部ではなく、グローバル状態の一部です。 –

+0

ありがとう、@ジェネ。私は答えを編集しました。 –

+0

いいえ、そうではありません。非静的メンバーだけがオブジェクトの「状態」として機能することができます。 –

2

パブリッククラスの場合、静的クラスのメンバーはヘッダーファイルを編集する必要があります。これは必ずしも望ましいことではありません。

もう1つのオプションは、匿名の名前空間内のファイルスコープ変数です。これは、1つのメソッドでのみアクセスが必要な場合や、複数のメソッドでアクセスする必要がある場合には十分です。

0

グローバルと非ローカルの両方のグローバル変数は、グローバルであることによって「悪い」ものです。しかし、これらの2つのケースに対する初期化とアクセスは異なります。したがって、使用する答えは、これらの要件に関するニーズに応じて異なります。サイドノートとして

、静的記憶域期間を持つローカル変数の動的な初期化はコンパイラによっては、スレッドセーフではないかもしれません。良いニュースは、C++ 0xではスレッドセーフであることが保証されています。

+0

グローバル変数には間違いがあります。問題は、グローバルにアクセス可能な可変状態です。ここでもどちらも当てはまりません。 –

4

私は通常、変数が奇妙にも退屈にもならない限り、できる限り多くの変数の範囲を制限しようとします。

あなたがそれらのclass Cのコードの1000行、機能foo内のコードの100行を持っている場合は、barにあなたが任意の変化(例えば、名前や種類を変更するには)にするために、コードの100行以上を行く必要が変更がOKであることを確認してください。 barが静的​​なクラスメンバーだった場合は、barがそこで使用されていないことを確認するために、1000行以上のコードを実行する必要があります。これは時間の無駄です。あなたが別の関数foo2barを必要とするかもしれないと思う場合は(一緒にfoofoo2のための呼び出し回数をカウントする場合、たとえば、)

、あなたはbar静的クラスのメンバを作りたいかもしれません。

+0

+1「静的な」変数スコープを最小化することが重要です。グローバル対.cppモジュール対クラス対メソッド/関数対ネスト{}ブロック。私は、.cppモジュールレベルの静的データをクラス宣言に含めるよりも好む傾向があります。なぜなら、クラスヘッダにスティックを貼り付けると、クライアントは実装の詳細に依存するからです。 – franji1

関連する問題