一单件模式问题?
各位兄弟,我现在碰到一个疑惑,有关于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>; // 类定义要加这个友元,才能访问私有构造
...
};
[解决办法]