1

我很确定这个问题不是新问题,而且很确定它很难解决。希望我对后者的看法是错误的。

我正在尝试在我的程序中使用 Modern C++ Design 中的 Loki::Singleton。

但是,我似乎无法让它跨 DLL 工作。我想我知道为什么会发生这种情况:模板化代码在每个源模块中都被实例化,因此每个模块都有自己的全局变量,而不是一个全局变量。

显然,这使得 Singleton 非常不单一。

有没有办法解决这种行为?

4

3 回答 3

2

我在 Loki 源目录中看到他们有一个正在测试的特定SingletonDLL 目录,看起来他们使用了一个导出的、显式实例化的模板(这会起作用)。希望其中包含您想要的代码。

于 2009-06-17T15:43:31.933 回答
1

请注意,这不会解决这个问题。显式实例化和导出的单例应该可以解决问题......

-瑞克

基本上在这里查看#pragma data_seg ,您需要在代码的共享部分中声明单例的实例。默认情况下,静态变量的范围是 dll。

使用模板可能会变得棘手,但这是成功的途径,不涉及传递/复制静态数据。

于 2009-06-17T15:31:15.953 回答
0

您可能是正确的,每个 DLL 都有自己的单例实例。我对 Loki 的实现不是很熟悉,而且源代码也不是很有趣。

可能的解决方案是:

  • 不使用单例。这实际上是我通常的偏好,因为您可以通过将设计更改为不需要它们来避免整类问题。关于单身人士为何有害的长篇大论,请参阅这篇Yegge 帖子。我并没有那么强烈地反对他们,但 95% 的情况下,单身人士造成的问题比他们解决的问题多得多(如果他们真的解决了任何问题)
  • 跨 DLL 边界复制静态成员。我也将其作为 hack 来完成,其中 DLL 从应用程序或另一个 DLL 获取指针,并将其自己的静态类成员副本重置为从外部传递的指针。它很邪恶,很脏,你无法清理它,但它确实有效。
于 2009-06-17T15:16:17.200 回答