Cannot access private member in singleton class destructor
I'm trying to implement this singleton class. But I encountered this error:
'Singleton::~Singleton': cannot access private member declared in class 'Singleton' This is flagged in the header file, the last line which contains the closing brace.
Can somebody help me explain what is causing this problem? Below is my source code.
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;
Inside my main function:
Singleton* s = Singleton::Instance();
If I make the destructor as public, then the problem disappears. But开发者_运维知识库 a book (Modern C++ Design) says it should be private to prevent users from deleting the instance. I actually need to put some code for cleanup for pInstance and destroyed inside the destructor.
By the way, I'm using Visual C++ 6.0 to compile.
You should probably have let us know that the version of Visual C++ you're working with is VC6. I can repro the error with that.
At this point, I have no suggestion other than to move up to a newer version of MSVC if possible (VC 2008 is available at no cost in the Express edition).
Just a couple other data points - VC2003 and later have no problem with the Singleton
destructor being private as in your sample.
The code you posted looks doesn't have any problem, so the problem must be in some other part of your source code.
The error message will be preceded by the filename and line number where the problem is occurring. Please look at the line and you'll see a bit of code that is either trying to call delete on a singleton pointer or is trying to construct an instance of singleton.
The error message will look something like this (the file and line number are just an example):
c:\path\to\file.cpp(41) : error C2248: 'Singleton::~Singleton': cannot access private member declared in class 'Singleton'
So in that case, you would want to see what is happening at line 41 in file.cpp.
I'm no C++ or VC expert, but your example looks similar to the one described on this page ... which the author calls a compiler bug.
Personally i haven't put destructors in my singletons unless i am using a template singleton class, but then i make them protected.
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(){};
};
then write my class as
class LogWriter : public Singleton<LogWriter>
{
friend class Singleton<LogWriter>;
}
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;
}
}
};
精彩评论