求大神见教“在单例模式中加入嵌套类,为什么程序不能正确运行呀?环境是VC6.0”
求大神指教“在单例模式中加入嵌套类,为什么程序不能正确运行呀?环境是VC6.0”
------解决方案--------------------
放在一个文件中测试,便已通过:
Emperor.h
//单例模式就是在系统中只允许产生这个类的一个实例
#ifndef EMPEROR_H
#define EMPEROR_H
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Emperor
{
public:
static Emperor * getInstance()//静态函数
{
if(pEmperor == NULL)
pEmperor = new Emperor();
return pEmperor;
}
static void releaseInstance()//静态函数
{
if(pEmperor != NULL)
{
delete pEmperor;
pEmperor = NULL;
}
}
void emperorInfo()
{
char msgBuffer[50] = {0};
// sprintf_s(msgBuffer, 50, "皇帝某某某: %s\n", EmperorTag.c_str() );
sprintf(msgBuffer, "皇帝某某某: %s\n",EmperorTag.c_str());
//函数c_str()返回一个指向正规C字符串的指针
string msg(msgBuffer);
cout<<msg.c_str()<<endl;
}
void setEmperorTag(string tag)
{
EmperorTag = tag;
}
private:
Emperor()
{
cout<<"Create Emperor Instance"<<endl;
}
//以下这两个函数只声明不实现
Emperor(const Emperor&);//拷贝构造函数
Emperor& operator=(const Emperor&);//重载赋值语句
virtual ~Emperor()
{
cout<<"Destroy Emperor Instance and release its resource"<<endl;
}
static Emperor *pEmperor;//静态类指针,在类外初始化
string EmperorTag;
//注意:将嵌套类注释掉后,程序才可以正确运行!!!
/* class Garbo//嵌套类,用于释放对象及其占用资源
{
public:
Garbo()
{
cout<<"Create Garbo"<<endl;
}
~Garbo()
{
cout<<"Destroy Garbo"<<endl;
if(pEmperor != NULL)
// if(Emperor::pEmperor)
{
cout<<"Remove instance"<<endl;
delete pEmperor;
pEmperor = NULL;
}
};
static Garbo garbo;//优先释放
*/
};
Emperor* Emperor::pEmperor = NULL;//静态类指针
//Emperor::Garbo Emperor::garbo;
#endif
Singleton.cpp
#include <iostream>
using namespace std;
#include "Emperor.h"
int main()
{
Emperor *pEmperor1 = Emperor::getInstance();
pEmperor1->setEmperorTag("96");
pEmperor1->emperorInfo();
Emperor *pEmperor2 = Emperor::getInstance();
pEmperor2->emperorInfo();
Emperor *pEmperor3 = Emperor::getInstance();
pEmperor3->emperorInfo();
Emperor *pEmperor4 = pEmperor3;
pEmperor4->emperorInfo();
Emperor *pEmperor5 = NULL;
pEmperor5 = pEmperor4;
pEmperor5->emperorInfo();
Emperor::releaseInstance();
return 0;
}
------解决方案--------------------
放在一个文件中测试,便已通过:
// test2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//单例模式就是在系统中只允许产生这个类的一个实例
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Emperor
{
private:
static Emperor *pEmperor;//静态类指针,在类外初始化
public:
static Emperor * getInstance()//静态函数
{
if(pEmperor == NULL)
pEmperor = new Emperor();
return pEmperor;
}
static void releaseInstance()//静态函数
{
if(pEmperor != NULL)
{
delete pEmperor;
pEmperor = NULL;
}
}
void emperorInfo()
{
char msgBuffer[50] = {0};
// sprintf_s(msgBuffer, 50, "皇帝某某某: %s\n", EmperorTag.c_str() );
sprintf(msgBuffer, "皇帝某某某: %s\n",EmperorTag.c_str());
//函数c_str()返回一个指向正规C字符串的指针
string msg(msgBuffer);
cout<<msg.c_str()<<endl;
}
void setEmperorTag(string tag)
{
EmperorTag = tag;
}
private:
Emperor()
{
cout<<"Create Emperor Instance"<<endl;
}
//以下这两个函数只声明不实现
Emperor(const Emperor&);//拷贝构造函数
Emperor& operator=(const Emperor&);//重载赋值语句
virtual ~Emperor()
{
cout<<"Destroy Emperor Instance and release its resource"<<endl;
}
string EmperorTag;
//注意:将嵌套类注释掉后,程序才可以正确运行!!!
class Garbo//嵌套类,用于释放对象及其占用资源
{
public:
Garbo()
{
cout<<"Create Garbo"<<endl;
}
~Garbo()
{
cout<<"Destroy Garbo"<<endl;
if(pEmperor != NULL)
// if(Emperor::pEmperor)
{
cout<<"Remove instance"<<endl;
delete pEmperor;
pEmperor = NULL;
}
}
};
static Garbo garbo;//优先释放