读书人

一单件模式有关问题

发布时间: 2012-04-12 15:46:35 作者: rapoo

一单件模式问题?
各位兄弟,我现在碰到一个疑惑,有关于C++中的单件模式问题,在vs2003中,
用以下的代码实现了单件模式的模版类singleton,具体的代码(也是整个singleton.hpp文件的内容)如下:
#ifndef _SINGLETON_HPP
#define _SINGLETON_HPP

template<class T>
class singleton: private T
{
private:
singleton();
~singleton();

public:
static T &instance();
};


template<class T>
inline singleton<T>::singleton()
{ /* no-op */ }

template<class T>
inline singleton<T>::~singleton()
{ /* no-op */ }

template<class T>
/*static*/ T &singleton<T>::instance()
{
// function-local static to force this to work correctly at static
// initialization time.
static singleton<T> s_oT;
return(s_oT);
}
#endif

然后我自己本身实现了一个简单的类 MyClass,该类的构造函数是private的,另有一个MyClass2类的变量, 声明如下:
MyClass2 *m_pMyClass2,大概的声明的代码如下:

class MyClass2;
class MyClass
{
private:
MyClass();
MyClass2 *m_pMyClass2
public:
MyClass2 * getClass2(){ return m_pMyClass2}; //
void doSomeThing(){ m_pMyClass2=new MyClass2();}
};

然后我在窗体的OnTimer事件中大致这样的代码使用

if( MyID1==nIDEvent)
{
MyClass& clsMy=singleton<MyClass>::instance();
if(另外一条件)
{
MyClass& clsMy=singleton<MyClass>::instance();
clsMy.doSomeThing();

//后面还有一些代码,进行USB打印机打印操作等
}
}

这段程序编译没问题,大部分时间也能正常运行,我的疑惑是: 两次这样调用
MyClass& clsMy=singleton<MyClass>::instance(); 这样会有可能造成异常现象发生(异常现象是整个程序会有16秒左右的时间'卡'住,查看CPU使用率也不高)吗?当然我的这个异常现象也有可能是 后面的代码(进行USB打印机打印操作)所造成的。请位兄弟帮帮忙?看两次这样调用
MyClass& clsMy=singleton<MyClass>::instance(); 会不会偶尔不正常?


[解决办法]
帮顶
[解决办法]
MyClass& clsMy=singleton <MyClass>::instance(); 会不会偶尔不正常?

没看出什么问题。
你把构造和析构的inline去掉看看。
[解决办法]
为什么要两次相同的定义呢,你可以先把后面的代码屏蔽掉然后看看是不是这里的原因。
[解决办法]
UP
[解决办法]


我觉得是这些代码的事情
//后面还有一些代码,进行USB打印机打印操作等

他们大概把OnTimer给阻塞了,是不是你可以去掉后面的代码不就知道了么。

[解决办法]
打调试信息, 测试它。看问题在那里!
[解决办法]
template <class T>
/*static*/ T &singleton <T>::instance()
{
// function-local static to force this to work correctly at static
// initialization time.
static singleton <T> s_oT; // 这边有问题,应该 T s_oT;
return(s_oT);
}

s_oT 的类型不是 你要的 T 类型, 根本没有 建立 T类型对象

所以后面你的代码居然可以编译,MyClass是私有构造,如果要构造对象,根本就通不过
class MyClass
{
friend class singleton<MyClass>; // 类定义要加这个友元,才能访问私有构造
...
};


[解决办法]

引用楼主 kacy16 的帖子:
各位兄弟,我现在碰到一个疑惑,有关于C++中的单件模式问题,在vs2003中,
用以下的代码实现了单件模式的模版类singleton,具体的代码(也是整个singleton.hpp文件的内容)如下:
#ifndef _SINGLETON_HPP
#define _SINGLETON_HPP

template <class T>
class singleton: private T
{
private:


singleton();
~singleton();

public:
static T &instance();
};


template <class T>
inline si…


[解决办法]
探讨
你用单体模版类,instance 是想要得到模版参数类型 T 的 一个 实例 ,而不是 singleton <T>的 一个实例。


static T &singleton <T>::instance() // 返回类型就是 T&
{
// function-local static to force this to work correctly at static
// initialization time.
static singleton <T> s_oT;
return(s_oT); // s_oT 根本不是 T 类型, 而是 singleton <T> 类型了,这个只是你的singleton模版…

[解决办法]
帮顶!!!
[解决办法]
一般代码就算有误也不可能会运行延时,除非死循环了
[解决办法]
static singleton <T> s_oT; 改成static T s_oT;

MyClass& clsMy=singleton <MyClass>::instance();
两次没关系。得到的只是同一个实例。
[解决办法]
static singleton <T> s_oT
这是一个T的派生类

static T s_oT;
这是一个T类

读书人网 >C++

热点推荐