1

私は次のことを行う関数を持っています:

  • 関数が呼び出されて真のブール値が渡されると、静的なブール値が真に設定されます
  • 関数が呼び出されて文字列が渡されたときに、静的ブール値が true に設定されている場合、その文字列に対して何かを行います。

ここに私の懸念があります-静的変数は、オーバーロードされた2つの関数間で同じままですか? そうでない場合は、ブール値を追跡するように設計された別の関数を作成するだけで済みますが、物事を単純に保つようにしています。

4

3 に答える 3

6

2つのオーバーロードされた関数は、2つの異なる関数です。各関数にstatic bool同じ識別子を持つが含まれている場合でも、それらは異なるスコープに属し、識別子は各関数の個別の変数を参照します。

2つの関数間で状態を共有する必要がある場合は、この状態をカプセル化するクラスを作成し、2つの関数をこのクラスのメンバー関数にする方がよいでしょう。

于 2010-06-14T07:31:27.330 に答える
3

いいえ、関数ごとに1つずつ、2つの個別の静的変数を作成します。C ++関数の名前は、その見かけの名前とパラメータータイプに基づいて作成され、静的な名前は(少なくとも概念的には)それに付け加えられます。さらに別の関数を追加するのではなく、関数を含むクラスに関して変数を静的にすることを検討できますが、これではまったく同じ動作が得られないか、匿名の名前空間に配置されます。

namespace {
   int myvar = 0;
}

int f( bool b ) {
   return myvar;
}

int f( const string &  s  ) {
   return myvar;
}

関数をクラスのメンバーにするには:

// a.h
class A {
   public:
    static int f( bool b ) {
       return myvar;
    }

    static int f( const string &  s  ) {
       return myvar;
    }
  private:
     static int myvar;
};

// a.cpp
int A::myvar = 0;   

// main.cpp

#include <iostream>
#include <a.h>
int main() {
    std::cout << A::f(false) << A::f( string("foobar") ) << std::endl;   
}
于 2010-06-14T07:31:44.253 に答える
0

答えはいいえだ。結局のところ、2つの関数について話しているので、そうあるべき理由はありません。

それはすでに実証されているので、私は問題の核心に取り組みたいと思います:static

staticグローバルな状態を導入し、グローバルな状態は悪です。それは微妙なバグ、適切なテストの難しさ(テストはその後に実行されるものに影響を与えるため)につながり、そこでマルチスレッド化することさえ考えていません...

したがって、私はあなたがstatic完全に避けることを本当にお勧めします。次に、2つの解決策があります。

  • 2つのオーバーロードをメソッドとして使用してクラスを作成し、状態を保存します(静的ではありません)。
  • メソッドにboolをパラメーターとして渡し、boolオーバーロードの場合はout-parameterを、文字列オーバーロードの場合はin-parameterを渡します。

達成しやすい方を選んでください。

于 2010-06-14T09:24:14.480 に答える