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


    讨论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

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

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



  • 相关阅读:
    Rails组件逐个数:Rails Form helpers
    watirwebdriver常用方法
    Rails组件逐个数:Rails Form helpers(续)
    rails常用命令速查手册
    Rails new, build, create, save方法区别
    Ruby如何使用require从外部加载自定义类或模块
    升级Firefox8后watirwebdriver出现错误“unable to obtain stable firefox connection in 60 seconds”
    POJ2723Get Luffy Out(2sat)
    POJ3683Priest John's Busiest Day(2sat)
    UVA11374Airport Express(dijkstra)
  • 原文地址:https://www.cnblogs.com/8586/p/code_disc.html
Copyright © 2020-2023  润新知