版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011068702/article/details/83834897
1 问题
实现c++的单例模式,这里测试分别写了通过智能指针返回对象和普通返回指针
2 代码测试
include <iostream>
#include <mutex>
#include <memory>
using namespace std;
class Single
{
public:
static Single& getInstance()
{
std::mutex mt;
if (instance.get() == NULL) {
mt.lock();
if (instance.get() == NULL) {
instance.reset(new Single());
}
mt.unlock();
}
return *instance;
}
private:
Single(){}
~Single(){}
static std::auto_ptr<Single> instance;
friend class std::auto_ptr<Single>;
Single(const Single&);
Single& operator= (const Single&);
};
std::auto_ptr<Single> Single::instance;
class Single1
{
public:
static Single1* getInstance()
{
mutex mt;
if (instance == NULL) {
mt.lock();
if (instance == NULL) {
instance = new Single1();
}
mt.unlock();
}
return instance;
}
private:
static Single1 *instance;
Single1() {}
~Single1() {}
Single1(const Single1&);
Single1& operator= (const Single1&);
};
Single1* Single1::instance = NULL;
int main()
{
Single &s = Single::getInstance();
Single1 *s1 = Single1::getInstance();
return 0;
}
3 总结
在写C++类的静态变量的时候,一定要单独拿出来初始化,这点和java有点不一样,切记,以后千万不能忘记,如果C++的静态变量直接在类里面
private:
static Single1 *instance = NULL;
初始化的编译提示错误如下,这里和java不同,Java的话静态变量直接在类里面初始化没毛病
non-const static data member must be initialized out of line
所以我们一定要记得C++静态变量的初始化
std::auto_ptr<Single> Single::instance;
Single1* Single1::instance = NULL;