无法访问singleton类析构函数中的私有成员

时间:2010-01-25 07:44:57

标签: c++ singleton destructor

我正在尝试实现这个单例类。但我遇到了这个错误:

'Singleton :: ~Singleton':无法访问类'Singleton'中声明的私有成员 这标记在头文件中,最后一行包含右括号。

有人可以帮我解释造成这个问题的原因吗? 以下是我的源代码。

Singleton.h:


class Singleton
{
public:
    static Singleton* Instance()
    {
        if( !pInstance )
        {
            if( destroyed )
            {
                // throw exception
            }
            else
            {
                Create();
            }

        }
        return pInstance;
    }
private:
    static void Create()
    {
        static Singleton myInstance;
        pInstance = &myInstance;
    }
    Singleton() {}
    Singleton( const Singleton& );
    Singleton& operator=( const Singleton& );
    ~Singleton() 
    {
        pInstance = 0;
        detroyed = false;
    }

    static Singleton* pInstance;
    static bool destroyed;
};

Singleton.cpp:


Singleton* Singleton::pInstance = 0;
bool Singleton::destroyed = false;

在我的主要功能中:


Singleton* s = Singleton::Instance();

如果我将析构函数设为公共,那么问题就会消失。但是一本书(Modern C ++ Design)说它应该是私有的,以防止用户删除该实例。我实际上需要为pInstance放置一些清理代码并在析构函数内部销毁。

顺便说一下,我正在使用Visual C ++ 6.0进行编译。

5 个答案:

答案 0 :(得分:2)

您发布的代码看起来没有任何问题,因此问题必须出在源代码的其他部分。

错误消息前面会出现问题所在的文件名和行号。请查看该行,您将看到一些代码尝试在单例指针上调用delete或尝试构造单例实例。

错误消息看起来像这样(文件和行号只是一个例子):

c:\path\to\file.cpp(41) : error C2248: 'Singleton::~Singleton': cannot access private member declared in class 'Singleton'

因此,在这种情况下,您可能希望查看file.cpp中第41行发生的情况。

答案 1 :(得分:2)

您可能应该告诉我们您正在使用的Visual C ++版本是VC6。我可以用这个来重现错误。

此时,我没有任何建议,除非尽可能升级到更新版本的MSVC(在Express版本中免费提供VC 2008)。

其他几个数据点 - VC2003及更高版本的示例中Singleton析构函数是私有的没有问题。

答案 2 :(得分:2)

我不是C ++或VC专家,但您的示例与this page上描述的示例类似......作者称之为编译器错误。

答案 3 :(得分:0)

我个人没有将析构函数放在我的单身人士中,除非我使用模板单例类,但后来我保护它们。

template<class T>
class Singleton
{
public:
    static T &GetInstance( void )
    {
        static T obj;
        return obj;
    }

    static T *GetInstancePtr( void )
    {
        return &(GetInstance());
    }

protected:
    virtual ~Singleton(){};
    Singleton(){};

};

然后把我的课写成

class LogWriter : public Singleton<LogWriter>
{
friend class Singleton<LogWriter>;
}

答案 4 :(得分:-1)

class Singleton
{
     static Singleton *pInstance = NULL;  
     Singleton(){};

     public:

    static Singleton * GetInstance() {

          if(!pInstance)
          {
               pInstance = new Singleton();
          }
          return pInstance;
     }

     static void  RemoveInstance() {

          if(pInstance)
          {
               delete pInstance;
               pInstance = NULL;
          }

     }
};