3

ばかげた質問があります!プロジェクト全体で使用されるグローバル変数があり、それが変更されたときに何かを実行しようとしていると仮定します。たとえば、関数を呼び出します。
簡単な方法の1つは、変更のたびに関数を呼び出すことです。しかし、このグローバル変数がライブラリの一部であり、外部で使用される場合はどうなりますか?より良い解決策はありますか?

4

5 に答える 5

8

おそらく、変数への参照を追跡したり、それに依存するすべてのコードを書き直したりせずに、変数がいつ変更されたかを調べたいと思うでしょう。

これを行うには、変数を現在の変数からオーバーロードするクラス型operator=に変更し、変更が発生したときに印刷/ログ/変更を行います。たとえば、現在次のものがあるとします。

int global;

変更がいつ行われるかを知りたいglobal

class logger { 
     int value;
public:
    logger &operator=(int v) { log(v); value= v; return *this; }

    // may need the following, if your code uses `+=`, `-=`. May also need to 
    // add `*=`, `/=`, etc., if they're used.
    logger &operator+=(int v) { log(value+v); value += v; return *this; }
    logger &operator-=(int v) { log(value-v); value -= v; return *this; }
    // ...

    // You'll definitely also need:
    operator int() { return value; }
};

をに置き換えてint global;logger global;へのすべての変更のログを取得しますglobal

于 2013-02-01T19:04:58.963 に答える
4

最も簡単な方法は、関数を呼び出す変数の set メソッドを作成してパブリックにすることですが、変数自体はプライベートのままにします。

//public
void setYourVariable(int newValue)
{
    YourVariable = newValue;
    YourFunction();
}
//private 
int YourVariable;
于 2013-02-01T18:40:49.823 に答える
2

グローバル変数を設定するには、アクセサー関数を作成する必要があります。次に、すべての呼び出し元に自分で実行させる代わりに、そのアクセサーから特別な関数を呼び出すことができます。

于 2013-02-01T18:40:17.983 に答える
0

ケビンが言ったように、外部からも呼び出される可能性があると言っているので、 Get() および Set(...) メソッドを使用することをお勧めします。メリットは主に2つ。1) セットを通じて、値が変化するたびに関数を呼び出したり、アクションを実行したりできます。2)変数を外部に直接公開することを避けることができます。

于 2013-02-01T18:59:04.270 に答える