オーバーロードされた関数の静的変数
-
27-09-2019 - |
質問
次のことを行う関数があります。
- 関数が呼び出され、true bool 値が渡されると、静的 bool 値が true に設定されます。
- 関数が呼び出されて文字列が渡されたとき、静的な bool 値が true に設定されている場合、その文字列を使用して何らかの処理が行われます。
ここで私の懸念があります。静的変数は 2 つのオーバーロードされた関数間で同じままでしょうか?そうでない場合は、bool 値を追跡するように設計された別の関数を作成することもできますが、私は物事を単純にするように努めています。
解決
はありません、それは、2つの別個の静的変数を作成します。任意のC ++関数の名前は、その見かけの名前とそのパラメータ型のOPが形成されており、静的の名前は、その上にタック(概念的少なくとも)です。これはあなたにまったく同じ動作を与えるものではありませんが、むしろアドオンさらに別の機能よりも、あなたは、関数を含むクラスに関して、変数、静的にすることを検討可能性があり、または匿名の名前空間に配置します:
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;
}
他のヒント
二つの関数は2つの異なる機能ですオーバーロードされます。各機能は、同じ識別子を持つstatic bool
が含まれていても、それらが異なるスコープに属し、識別子が各機能に異なる変数を指す。
あなたはおそらく、より良い、この状態をカプセル化するクラスを作成し、このクラスの2つの関数メンバ関数を作るオフになっています。
答えはいいえだ。結局のところ、私たちは 2 つの機能について話しているのですから、そうあるべき理由はありません。
それはすでに証明されているので、問題の核心に触れたいと思います。 static
.
static
グローバル状態を導入しますが、グローバル状態は悪です。それは微妙なバグにつながり、適切なテストが困難になり(テストはその後に実行されるテストに影響するため)、そこでマルチスレッド化することさえ考えられません...
したがって、次のようなことは避けることを強くお勧めします。 static
全体的に。その場合、解決策は 2 つあります。
- 2 つのオーバーロードをメソッドとして含むクラスを作成し、状態を保存します (静的ではないでください)。
- bool をパラメータとしてメソッドに渡します。bool オーバーロードの場合は out パラメータ、string オーバーロードの場合は in パラメータです。
達成しやすい方を選択してください。