4

私がしたいこと: クラスのインスタンスがプログラム内で使用されるときはいつでも、いくつかの前提条件コードを実行します。このコードは要件などをチェックし、一度だけ実行する必要があります。

これは、別のオブジェクトをコンストラクター内の静的変数として使用して実現できることがわかりました。より良い画像の例を次に示します。

class Prerequisites
{
     public:
         Prerequisites() {
              std::cout << "checking requirements of C, ";
              std::cout << "registering C in dictionary, etc." << std::endl;
         }
};


class C
{
    public:
         C() {
             static Prerequisites prerequisites;
             std::cout << "normal initialization of C object" << std::endl;
         }
};

私を悩ませているのは、これまで静的変数の同様の使用法を見たことがないということです。欠点や副作用はありますか、それとも何か不足していますか? それとも、より良い解決策がありますか?どんな提案でも大歓迎です。

4

3 に答える 3

6

2 つのスレッドが同時に初めて C を構築しようとすると、前提条件がおそらく 2 回初期化されるため、これはスレッド セーフではありません。

あなたがそれでよければ、おそらくこれを行うことができますが、スコープ付きコンストラクター システムのゲームは発見可能性がゼロです (つまり、「トリック」を忘れたり、他の人があなたのコードを読み取ろうとすると、何が起こっているのかについて困惑するでしょう)。 )。

于 2010-05-29T23:15:09.610 に答える
4

欠点や副作用はありますか、それとも何か不足していますか? それとも、より良い解決策がありますか?どんな提案でも大歓迎です。

静的メソッドを明示的に呼び出す方が明確かもしれません (より冗長ですが)。

class Prerequisites
{
    static bool checkedOnce;    
public:
    static void checkOnce() {
        if (checkedOnce)
        {
            //already checked: don't check again
            return;
        }
        //else check them now
        checkedOnce = true;
        std::cout << "checking requirements of C, ";
        std::cout << "registering C in dictionary, etc." << std::endl;
    }
};

bool Prerequisites::checkedOnce = false;

class C
{
public:
    C() {
        Prerequisites::checkOnce();
        std::cout << "normal initialization of C object" << std::endl;
    }
};
于 2010-05-29T23:26:08.413 に答える
1

Prerequisites オブジェクトの複数の初期化から保護するために、少なくとも Prerequisites クラス内でミューテックスと静的フラグを使用する必要があります。そうすれば、コードはスレッドセーフになります。

于 2010-05-30T00:05:58.053 に答える