1

最近、プロジェクトからシングルトンとグローバル変数の使用を削除しようとしていますが、そうするのに苦労しています。シングルトンとグローバル変数に代わるより良い方法をいくらか考案しましたが、アプリケーションが終了した後のデータの処理方法がわかりません。

私のアプリケーションは、ほとんどのコンポーネントが適切に機能するために、いくつかのものにアクセスする必要があります。一部のコンポーネントはアクセスするstatic std::vector<Foo*> foos;必要があり、他のコンポーネントはアクセスする必要があり、一部のコンポーネントはstatic std::vector<Bob*> bobs;両方にアクセスする必要があります。私が行ったことは、これらのベクトルの「マネージャー」、保護された静的ベクトルへのアクセスをそれを継承するクラスに与える FooManager と、他のベクトルに対して同じことを行う BobManager を作成することです。これにより、これら 2 つのオブジェクトの範囲が制限されます。私の問題は、プロセスの終了時に、各ベクトルのポインターをどこでどのように解放するのですか? 複数のクラスがこれらのオブジェクトの「マネージャー」になりました。派生クラスから?しかし、別のクラスが元のデータを必要としているときに何かの割り当てを解除するとどうなるでしょうか?

基本的に私の質問は、そうすべきではないときにポインターを削除しないようにするにはどうすればよいですか? unique_ptr? 共有_ptr? また、これの他の実装も大歓迎です。

4

2 に答える 2

1

デザインに選択肢がある場合は、Idan の最後の段落を参考にしてください (再び含まれています)。

それでもシングルトン パターンを避けたい場合は、これらのベクトルを再度非静的にし、メイン関数またはその他のルートっぽい関数で各マネージャーの単一のインスタンスを作成し、それらを他の任意の関数に渡すことをお勧めします。それらを必要とするオブジェクト。はい、それは大変な作業ですが、それらのベクトル (およびそれらが指すオブジェクト) がいつ作成され、破棄されるかを制御できます。または - シングルトンを使用することもできます。

あなたの質問:

基本的に私の質問は、そうすべきではないときにポインターを削除しないようにするにはどうすればよいですか? unique_ptr? 共有_ptr? また、これの他の実装も大歓迎です。

参照カウントは、問題を解決する 1 つの方法です。一連のデータに関心のあるものの数を追跡します。(現在の実装での) 簡単な方法は、インスタンスの数を追跡するマネージャー クラスに変数を含めることです。デストラクタでカウンタをデクリメントします。カウンターが 0 の場合は、ベクターを削除します。

于 2013-02-07T02:33:03.230 に答える
0

私の理解が正しければ、グローバルにアクセスする必要がある 2 つのベクトルがあり、それぞれを処理するシングルトンが使用されていました。これらのシングルトンを削除し、代わりにそれらのベクトルを静的メンバーにして、Manager クラスのインスタンスを多数作成しますか?

しないでください。ただ...しないでください。

グローバル変数が問題です。シングルトンは一種のグローバル変数であり、したがって問題でもあるという誤解があります。そうではありません - シングルトンはグローバル変数の問題に対する解決策です。解決策を削除しても、問題が解決するわけではありません。解決策のない問題があることを意味するだけです。

それでもシングルトン パターンを避けたい場合は、これらのベクトルを再度非静的にし、関数または他のルートっぽい関数で各マネージャーの単一のインスタンスを作成し、それらmain他のオブジェクトに渡すことをお勧めします。それはそれらを必要とします。はい、それは大変な作業ですが、それらのベクトル (およびそれらが指すオブジェクト) がいつ作成され、破棄されるかを制御できます。または - シングルトンを使用することもできます。

于 2013-02-07T01:36:56.557 に答える