1

この問題は新しいものではなく、解決するのが難しいと確信しています。うまくいけば、私は後者について間違っています。

私のプログラムで、Modern C++ Design の Loki::Singleton を使用しようとしています。

ただし、DLL 間で動作させることはできないようです。なぜこれが起こっているのかはわかっていると思います。テンプレート化されたコードはすべてのソース モジュールでインスタンス化されるため、1 つのグローバル変数ではなく、各モジュールに独自の変数があります。

明らかに、これによりシングルトンは非常に非シングルになります。

この動作を回避する方法はありますか?

4

3 に答える 3

1

これは質問に対処するつもりはないことに注意してください。明示的にインスタンス化され、エクスポートされたシングルトンがうまくいくはずです...

-リック

ここで#pragma data_seg を確認してください。基本的には、コードの共有セクションでシングルトンのインスタンスを宣言する必要があります。デフォルトでは、スタティックのスコープは dll です。

テンプレートではややこしいかもしれませんが、静的データの受け渡しやコピーを必要としない成功への道です。

于 2009-06-17T15:31:15.953 に答える
0

おそらく、各 DLL が独自のシングルトン インスタンスを持っていることは正しいでしょう。私は Loki の実装にあまり詳しくなく、ソース コードを理解するのもあまり楽しくありません。

考えられる解決策は次のとおりです。

  • シングルトンを使用していません。設計を変更して問題を不要にすることで、クラス全体の問題を回避できるため、これは実際には私の通常の好みです。シングルトンが有害である可能性がある理由についての長い怒りについては、このYegge の投稿を参照してください。私はそれほど激しく反対しているわけではありませんが、95% の確率で、シングルトンは解決するよりも多くの問題を引き起こします (実際に解決した場合)。
  • DLL の境界を越えて静的メンバーをコピーします。私はまた、DLL がアプリケーションまたは別の DLL からポインターを取得し、静的クラス メンバーの独自のコピーを外部から渡されたポインターにリセットするハックとしてこれを行いました。それは悪いことであり、汚いことであり、後片付けはできませんが、うまくいきます。
于 2009-06-17T15:16:17.200 に答える