使用静态类函数创建Singleton对象/实例

时间:2011-01-18 10:21:36

标签: c++

我正在尝试创建一个静态成员函数,该函数返回指向该类的一个实例的指针。这在C ++中是否可行?

    class DynamicMemoryLog
{
    // Singleton Class:

    public:

        static DynamicMemoryLog* CreateLog();
        void   AddIObject( IUnknown* obj );
        void   ReleaseDynamicMemory();

    private:
        // static DynamicMemoryLog* instance;
        static bool isAlive;  // used to determine is an instance of DynamicMemoryLog already exists

        DynamicMemoryLog();
        ~DynamicMemoryLog();

        std::vector <IUnknown*> iObjectList;
};

下面这个函数应该创建一个类的新实例&amp;返回一个指向该对象的指针,但是如果它返回一个指针,编译器将不允许我定义该类的静态函数(我认为这就是为什么它不会编译?):

static DynamicMemoryLog* DynamicMemoryLog :: CreateLog()
{
    // Post:

    if ( !isAlive )   // ( instance == NULL; )
    {
       DynamicMemoryLog* instance  = new DynamicMemoryLog();
       return instance;
    }

    return NULL;
}

3 个答案:

答案 0 :(得分:2)

您遇到的特定错误是,在实现静态成员函数时,您不会重复static关键字。修复此问题应解决错误。

独立地,你的代码有些奇怪。您声称此对象是单个对象,但每次调用CreateLog都将创建该类的新实例。你真的想要这种行为,还是你想要那么多副本?我建议在继续之前调查一下。

答案 1 :(得分:1)

这是最简单的解决方案,但不是线程安全的。有关详细分析,请查看this article

class DynamicMemoryLog 
{
public:
   static DynamicMemoryLog* GetInstance();
private:
   DynamicMemoryLog();
   static DynamicMemoryLog* m_pInstance;
}

DynamicMemoryLog* DynamicMemoryLog::GetInstance()
{
   if(!m_pInstance)    
   {
      m_pInstance = new DynamicMemoryLog();       
   }     

   return m_pInstance;
}

答案 2 :(得分:0)

我通常做这样的事情:

class Singleton
{
    public:

        static Singleton* get()
        {
            static Singleton instance;
            return &instance;
        }
};

这样你就不会有任何讨厌的内存管理问题。