c++实现单例模式的深层有关问题求讨论
c++实现单例模式的深层问题求讨论
小弟自己实现了一个单例代码类似于这样
//Singleton.h
#include <iostream>
using namespace std;
//单例类的C++实现
class Singleton
{
private:
Singleton();//注意:构造方法私有
~Singleton();
static Singleton* instance;//惟一实例
int m_var;//成员变量(用于测试)
public:
static Singleton* GetInstance();//用来获得实例
int getVar();//获得var的值
void setVar(int);//设置var的值
};
//Singleton.cpp
Singleton* Singleton::instance = NULL;
//构造方法实现
Singleton::Singleton()
{
}
Singleton::~Singleton()
{
if(instance != NULL)
{
delete instance;
}
}
Singleton* Singleton::GetInstance()
{
if(instance == NULL)
{
instance = new Singleton();
}
else
{
return instance; //请注意这个地方是有错误的,该方法不确定一定能返回值。
}
}
//seter && getter含数
int Singleton::getVar()
{
return this->m_var;
}
void Singleton::setVar(int var)
{
//m_var = var; 如果这么写执行程序会段错误
//this->m_var = var; 这么写也是段错误
instance->m_var = var; 这么写居然对了,程序执行没有任何问题
}
//main.cpp
int main(int argc, char* argv[])
{
Singleton::GetInstance()->setVar(1);
cout<<"var = "<<Singleton::GetInstance()->getVar()<<endl;
return 0;
}
求高人指点,这段代码之所以能够正常运行的原理
------解决方案--------------------
GetInstance()函数那里else要去掉,返回了一个错误的指针,但由于setvar是直接用的instance,这个已经初始化过了,所以是正确的,如果用this则出错,以后的调用不会返回错误因此不会再有问题
------解决方案--------------------
instance是静态变量,自然无论在那里调用都是一样的,至于错误的指针为啥能调用函数还真是不大清楚
小弟自己实现了一个单例代码类似于这样
//Singleton.h
#include <iostream>
using namespace std;
//单例类的C++实现
class Singleton
{
private:
Singleton();//注意:构造方法私有
~Singleton();
static Singleton* instance;//惟一实例
int m_var;//成员变量(用于测试)
public:
static Singleton* GetInstance();//用来获得实例
int getVar();//获得var的值
void setVar(int);//设置var的值
};
//Singleton.cpp
Singleton* Singleton::instance = NULL;
//构造方法实现
Singleton::Singleton()
{
}
Singleton::~Singleton()
{
if(instance != NULL)
{
delete instance;
}
}
Singleton* Singleton::GetInstance()
{
if(instance == NULL)
{
instance = new Singleton();
}
else
{
return instance; //请注意这个地方是有错误的,该方法不确定一定能返回值。
}
}
//seter && getter含数
int Singleton::getVar()
{
return this->m_var;
}
void Singleton::setVar(int var)
{
//m_var = var; 如果这么写执行程序会段错误
//this->m_var = var; 这么写也是段错误
instance->m_var = var; 这么写居然对了,程序执行没有任何问题
}
//main.cpp
int main(int argc, char* argv[])
{
Singleton::GetInstance()->setVar(1);
cout<<"var = "<<Singleton::GetInstance()->getVar()<<endl;
return 0;
}
求高人指点,这段代码之所以能够正常运行的原理
------解决方案--------------------
GetInstance()函数那里else要去掉,返回了一个错误的指针,但由于setvar是直接用的instance,这个已经初始化过了,所以是正确的,如果用this则出错,以后的调用不会返回错误因此不会再有问题
------解决方案--------------------
instance是静态变量,自然无论在那里调用都是一样的,至于错误的指针为啥能调用函数还真是不大清楚