今天被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 编辑 ] 最后只好不用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); 上面AbstractA是个接口类,有纯虚函数,不能实例化
ConcreteA是其子类,可以实例化 看了下ACE的reactor的singleton,也没有利用ACE_Singleton,也是自己实现的的
static ACE_Reactor *instance (ACE_Reactor *, int delete_reactor = 0);
奇怪ACE_Singleton为什么没提供这样的设值方法呢,,很实用啊又不麻烦
[ 本帖最后由 wishel 于 2008-8-31 10:37 编辑 ]
页:
[1]