|
发表于 2009-12-5 13:08:00
|
显示全部楼层
Re:如何保证一个对象最先构造,最后析构?
1.把构造权限下放给最终用户.并强制用户先构造被依赖对象.否则报错.
template<t>
class Singleton
{
public:
static t &GetInstance()
{
如果ms_singleton为空则抛出异常.
return *ms_singleton;
}
...
private:
static T* ms_singleton;
};
比如 class supporter : public singleton<supporter>;
用户必须先 new 出 supporter,才能使用其他对象,否则其他对象在引用supporter时报错.
2.把support声明为全局静态对象.如果依赖他的对象是局部对象,没有问题.如果是静态对象,那么问题就变成了静态对象的初始化顺序问题.使用praga init_seg确实不好,我在网上看到另一个办法,就是把全局对象的声明放到同一个公共的头文件里面,按顺序.虽然C++标准没有定义各个文件内的静态对象的构造和析构顺序,但是在同一个文件内声明的对象先声明的会先构造.这个方法还没有试过..
3.使用singleton懒惰初始化方式,并用智能指针代替裸指针.并且依赖supporter的对象内部保存一个supporter的智能指针,这个原理跟楼主的类似啦.
问题是如果你的对象是面向其他开发使用者的时候,而不只是你自己用,那么用户的对象依赖你的supporter时,还是要强制用户自己的对象也得保存一个智能指针.
拿楼主的类举例:
如果其他人用你的类库,他的一个类依赖你的支持者,那么他自己写的类里面必须有一个你的CSupporter成员.
个人感觉这样的限制有时候更繁琐,不如第一种,一次性搞定,用户只需要在最开始构造CSupporter,最后删除他就行.
拿OGRE举例,我只要在一开始就new一个Ogre::Root,以后我的引用都是合法的.我保证在最后把Ogre::Root给delete掉就可以.
当然如果你的CSupporter只是供自己内部调用就没有这个问题了,自己的类里面有一个CSupporter成员来保证初始化顺序,别人用的时候就不用管这些了.呵呵. |
|