wishel 发表于 2008-8-21 14:56:09

今天被ACE_Singleton搞的吐血。。。

想做一个虚的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 编辑 ]

wishel 发表于 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);

wishel 发表于 2008-8-21 15:05:03

上面AbstractA是个接口类,有纯虚函数,不能实例化
ConcreteA是其子类,可以实例化

wishel 发表于 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 编辑 ]
页: [1]
查看完整版本: 今天被ACE_Singleton搞的吐血。。。