一:通过友元的形式
友元的特点:单向,不具有传递性,不能被继承,可以访问类的私有成员
友元的声明不受public/protected/private关键字限制
这里,类Singleton是类AutoRealease的友元,故AutoRealease能访问Singleton的私有成员
#include <iostream>
using std::cout;
using std::endl;
class Singleton
{
friend class AutoRealease;
public:
static Singleton * getInstance()
{
if (nullptr == _pInstance)
{
_pInstance = new Singleton();
}
return _pInstance;
}
static void destory()
{
if (_pInstance)
{
delete _pInstance;
_pInstance = nullptr;
}
private:
Singleton() {}
~Singleton(){}
private:
static Singleton * _pInstance;
};
Singleton * Singleton::_pInstance = nullptr;
class AutoRealease
{
public:
AutoRealease() {} //调用它的默认构造函数
~AutoRealease ()
{
if (Singleton::_pInstance;
{
delete Singleton::_pInstance;
Singleton::_pInstance = nullptr;
}
}
};
void test0()
{
Singleton * ps1 = Singleton::getInstance();
AutoRealease aut;
}
int main()
{
test0();
return 0;
}
二,内部类加静态数据成员的形式
#include <iostream>
using std::cout;
using std::endl;
class Singleton
{
public:
static Singleton *getInstance()
{
if (nullptr == _pInstance)
{
_pInstance = new Singleton();
}
return _pInstance;
}
static void destroy()
{
if (_pInstance)
{
delete _pInstance;
_pInstance = nullptr;
}
private:
class AutoRealease
{
public:
AutoRealease() {}
~AutoRealease()
{
if (_pInstance)
{
delete _pInstance;
_pInstance = nullptr;
}
}
};
private:
static Singleton *_pInstance;
static AutoRealease _ar;
};
Singleton *Singleton::_pInstance = nullptr;
Singleton::AutoRealease Singleton::_ar;
void test0()
{
Singleton *ps1 = Singleton::getInstance();
}
int main()
{
test0();
return 0;
}