2009-12-10 81 views
2

我有一个需要成为单身人士的班级。它实现使用静态成员指针:C++:复制静态成员?

class MySinglton 
{ 
public: 
    static MySinglton& instance() { ... } 
private: 
    static MySinglton* m_inst; 
}; 

这个类被编译成它在多个DLL使用在同一应用程序一个的.lib。问题是每个DLL看到不同的m_inst。因为它是独立编译和链接的。

解决此问题的简单方法是什么?

将.lib分隔到自己的dll不是一个选项。它必须是.lib。

+0

不要编译到.lib中。编译成一个dll。然后所有其他的DLL将使用相同的实例。 – 2009-12-10 16:28:58

+0

实例不应该是静态的 – rerun 2009-12-10 20:02:54

+0

是的,谢谢,修正 – shoosh 2009-12-10 20:06:07

回答

0

一个解决方案可以在实例被转移到应用程序,并在初始化过程中的DLL会得到引用。 它可能没有你想要的那么优雅,但它可以做到。

需要知道什么是你的问题背后的真正问题。 答案可能不是你期望的形式。 ;)

+0

......它没有比这更真实。两个dll,一个lib,两个实例。 – shoosh 2009-12-10 12:14:27

+1

嗯......“如果山不去穆罕默德,让穆罕默德去山上。” ;) 对不起。 – 2009-12-11 10:47:44

0

我不知道你是否认为这很简单,但你需要分配一个“主实例”(在堆上),然后让所有MySingleton实例引用“主实例”。

+0

是的,但是所有实例如何知道这个主实例? – shoosh 2009-12-10 10:29:05

+0

正如Denes Tarjan指出的那样,“主实例”可以在初始化过程中由应用程序传递给所有实例 – 2009-12-18 12:43:58

0

C++没有内置的机制来以您所需的方式共享变量。唯一的解决方案是使用指针或引用将单个实例作为函数参数传递。

-1

不知道,如果是做到这一点的最好办法......但我会那样做:
建立你单身一个DLL本身,然后添加外部方法:
- 给init它
- 检索它。

+0

“将.lib分隔为自己的dll不是一个选项,它必须是.lib。” – shoosh 2009-12-10 10:34:52

+0

DLL的每个实例都会得到自己的变量副本,这不像他看起来那样。 – 2009-12-10 10:35:04

+0

实际上,您可以通过DLL共享数据:http://msdn.microsoft.com/en-us/library/h90dkhs0(VS.80).aspx – Tryum 2009-12-10 11:00:12

1

解决此问题的一种方法是创建共享内存并在共享内存中创建对象。这两个模块仍然有两个指针副本,但它们指向相同的位置,即对象的同一个实例。

+0

-1,再次阅读该问题。这些dll映射到相同的地址空间。 – avakar 2009-12-10 11:31:15

+0

@avakar,那有什么关系?使用命名的共享内存即使在同一个程序中也只是一种换向方式。 – leiz 2009-12-10 19:15:35

+0

我的不好,我现在看到你的观点,并已经取消了反对票。我不得不做一个小小的修改,这样SO才可以改变投票结果。 – avakar 2009-12-11 22:26:22

0

我会使用你的os,MapViewOfFile或shmem提供的共享内存机制。这可能会去:

class MySinglton 
{ 
    public: 
     static MySinglton& instance() { 
      static MySinglton* m_inst = get_shared(); 
      return *m_inst; 
     } 
    private: 
     static MySinglton * get_shared() 
     { 
      //1. Try to open shared memory, handle = OpenFileMapping. 
      //2. If successful, return MapViewOfFile(handle). 
      //3. Else, allocate enough space using CreateFileMapping, sizeof(MySingleton). 
      //4. Initialise MapViewOfFile(handle), return MapViewOfFile(handle). 
     } 

     void Initialise() 
     { 
      // Stuff you would normally do in operator new here. 
     } 

}; 
-1

有没有简单的解决方案,您的问题。 问题:如果没有解决办法shoosh你打算怎么做?放弃这个项目?或者重新构建它,以便'必须是.lib'约束被删除?如果这个问题涉及一个商业项目,你会对项目经理,利益相关者等等说些什么?

+0

我要告诉他们我正在使用共享内存来确保所有实例都具有相同的指针......这不是我希望的简单解决方案。这是什么态度? – shoosh 2009-12-10 15:15:02

+0

只是对问题的背景,如何成为问题以及询问假设问题的专业好奇心。我确信其他C++开发人员在他们的脑海中提出这些和其他问题。如果你有罪,我很抱歉;没有人打算。 – Sam 2009-12-10 23:13:05