找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5794|回复: 3

今天被ACE_Singleton搞的吐血。。。

[复制链接]
发表于 2008-8-21 14:56:09 | 显示全部楼层 |阅读模式
想做一个虚的singleton,可以返回实际指向子类的指针。
如ACE_Singleton<AbstractA*, ACE_Null_Mutex>::instance() 返回的实际上是一个ConcreteA*。
但是ACE_Singleton不支持重设封装的底层singleton,只好自己继承一下,自己实现:

class AbstractASingleton : public ACE_Singleton<AbstractA*, ACE_Null_Mutex> {
protected:
    static void instance(AbstractA* aa);
};
void AbstractASingleton::instance(AbstractA* aa) {
    instance_ = aa;
}
但是G++编译器死活报错:error: `AbstractA*ACE_Singleton<AbstractA*, ACE_Null_Mutex>::instance_' is protected

ace/Singleton.h 中的源码中instance_是protected,但是 AbstractASingleton是子类啊,应该有权限访问的,吐血。。。。

[ 本帖最后由 wishel 于 2008-8-21 15:06 编辑 ]
 楼主| 发表于 2008-8-21 15:02:35 | 显示全部楼层
最后只好不用ACE_Singleton,自己写:

class AbstractASingleton {
public:
        static AbstractA* instance();
        static void instance(AbstractA* aa);
private:
        static AbstractA* theInstance;
};
AbstractA* AbstractASingleton::theInstance = NULL;

AbstractA* AbstractASingleton::instance() {
        assert(NULL != theInstance);
        return theInstance;
}
void AbstractASingleton::instance(AbstractA* aa) {
        theInstance = aa;
}


用法如下:
ConcreteA ca;
AbstractASingleton::instance(&ca);
 楼主| 发表于 2008-8-21 15:05:03 | 显示全部楼层
上面AbstractA是个接口类,有纯虚函数,不能实例化
ConcreteA是其子类,可以实例化
 楼主| 发表于 2008-8-31 10:35:31 | 显示全部楼层
看了下ACE的reactor的singleton,也没有利用ACE_Singleton,也是自己实现的的
static ACE_Reactor *instance (ACE_Reactor *, int delete_reactor = 0);

奇怪ACE_Singleton为什么没提供这样的设值方法呢,,很实用啊又不麻烦

[ 本帖最后由 wishel 于 2008-8-31 10:37 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-4 01:36 , Processed in 0.019083 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表