博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

讨论exe获取dll提供的单例,并获取单例所提供的带有vector<class A>& STL容器的返回值的情况

开发过程中是苦逼的,遇到问题时,心情是烦躁滴,仔细想想问题是可以解决滴,而后是喜悦滴~废话略过...

 

一、问题描述:

1.首先看下单例的实现:

View Code
 1     template <class T>    
 2     class TSingleton    
 3     {    
 4     public:
 5         static  T* getInstance();
 6 
 7     private:
 8         TSingleton(void){}
 9         ~TSingleton(void){}
10         TSingleton(const TSingleton&){}
11         TSingleton & operator= (const TSingleton &){}
12 
13     private:
14         static std::auto_ptr<T> s_objInstance;
15     };
16 
17     template <class T> std::auto_ptr<T> TSingleton<T>::s_objInstance;
18 
19     template <class T>
20      T* TSingleton<T>::getInstance()
21      {
22         if (NULL != s_objInstance.get())
23             return s_objInstance.get();
24 
25         if(NULL == s_objInstance.get())    
26         {
27             s_objInstance.reset(new T);
28         }
29         return s_objInstance.get();
30     }

 对于单例的实现还是比较简单的,这里不讨论多线程加锁问题,只讨论dll中的单例,在exe中获取的情况,并能正常调用返回值类型为

vector<class A>& 等类型的接口,其他STL接口亦同。

我dll中的单例是这样定义的:

samples.h

View Code
 1 class  __declspec(dllexport) CSamples
 2 
 3 {
 4 
 5 public:
 6 
 7 vector<CSample*>& GetSamples()
 8 
 9 {
10 
11 return m_VecSamples;
12 
13 }
14 
15 private:
16 
17 vector<CSample*> m_VecSamples;//路径容器
18 
19 }
20 
21 typedef TSingleton<CSamples> SGCSamples;

 如果工程不分dll的话,我想不用描述该怎么调用了吧:

1 SGCSamples::getInstance()->GetSamples();

但是自从dll分离出来,在exe中再执行这个代码问题就来了,exe中调用

SGCSamples::getInstance(),会重新生成一份CSamples的static变量,也及是exe,dll中各一份,而且不一致,我测试了下,即使改成这样也不行:
Samples.h
...
__declspec(dllexport) typedef TSingleton<CSamples> SGCSamples;

exe 的.cpp

__declspec(dllimport)  typedef TSingleton<CSamples> SGCSamples;

为什么这样,暂时还没有理解,还请各位跟帖讨论

 

2.问题摆在这儿了,现在目标就是这么实现了,不废话,直接看解决方法:

二、提供接口返回实例的引用

//Samples.h
typedef    TSingleton<CSamples>    SGCSamples;
__declspec(dllexport) CSamples& GetSamples();


//samples.cpp
CSamples& GetSamples()
{
 return *SGCSamples::getInstance();
}
exe中调用:
CSamples& samples = GetSamples();
samples->GetSamples();
...

二、不用单例

可参考这里:http://stackoverflow.com/questions/10520587/how-to-implement-a-singleton-in-an-application-with-dll

通过每次讨论,从侧面也可得出,不要在接口中返回vector,包装下(如放入CSamples类中)后,获得实例,然后由实例返回STL更好

 而对于单例的实现,这里有详细的讨论:

http://www.cppblog.com/dyj057/archive/2005/09/20/346.html

 

本文为原创-转发请注明连接:

对于以上实现,如果有更好的其他实现,请网友们提供,先谢谢各位!