我正在尝试实现这个单例类。但我遇到了这个错误:
'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进行编译。
答案 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;
}
}
};