2

RAII ルールに従い、C++ でクラスを開発する場合、静的コンストラクターが必要になりますか? 静的コンストラクターは何らかの形で私を助けてくれますか?それとも間違った手順でしょうか?

4

3 に答える 3

4

それは意味がありません。静的コンストラクターを持つことはできません。コンストラクターの全体的な目的は、クラスの特定のインスタンスを初期化することです。静的であれば、どのインスタンスにも属しません。

RAII は、デストラクタでリソースを解放する必要があること、およびそのリソースの取得は、そのデストラクタを実行するオブジェクトの初期化 (構築) で行われることを示しているだけです。(これには、作業代入演算子とともに、作業中または禁止されているコピーコンストラクターが必要です

于 2010-11-05T09:44:10.250 に答える
1

CreateInstance()クラスのインスタンスを返す静的関数を使用できます。

RAII を使用すると、実際のオブジェクトのコピーを避けるために、作成したインスタンスへのスマート ポインターを関数から返さなければならない可能性があります。次に、このポインターを保存し、必要に応じて他の場所にコピーします。すべてのスマート ポインターが破棄されると、オブジェクトも破棄されます。それが必要な場合は、はい-「静的コンストラクター」を使用できます。

もちろん、これは RAII では必須ではなく、通常は不要な複雑さです。

于 2010-11-05T09:59:30.650 に答える
1

クラスのインスタンスを作成する静的ファクトリ関数について話していると思います(他の人が指摘したように)。その場合、RAII パターンを使用する必要はありません。

コンストラクターが (自動的に) 呼び出され、さまざまなデータが初期化されるように、クラスをスタックに割り当てる必要があることに注意してください 。また、 スタックが巻き戻され、リソースの解放などの他の操作を実行するときに、デストラクタが (自動的に) 呼び出されます。

クラスがそのデータを静的に初期化する場合、静的に保持されたデータはクラスのインスタンスにバインドされないため、RAII パターンは失敗します。したがって、スタックが巻き戻されると、破壊するインスタンスがなく、デストラクタが呼び出されず、RAII パターンは実装されません。

于 2010-11-05T10:13:36.690 に答える