大家帮我看看我的类这样设计行不行
class B {
public:
static void
close() {
delete pb_;
}
protected:
virtual ~B() {
}
protected:
static B* pb_;
};
B* B::pb_ = 0;
class D : public B {
public:
static B*
instance() {
if ( !pb_ )
pb_ = new D;
return pb_;
}
private:
D(const D&);
D&
operator=(const D&);
};
问题点数:0、回复次数:13Top
1 楼Underwind(Underwind)回复于 2005-04-02 21:18:33 得分 0
想实现singleton ? 编译一下呗,没有error就是行Top
2 楼ppddt008(pp点点通零零发)回复于 2005-04-02 21:21:00 得分 0
编译是没有问题的。
不过我不知道吧close放在B好不好?Top
3 楼Underwind(Underwind)回复于 2005-04-02 21:24:21 得分 0
为什么不把close()设置成private,然后再virtual ~B()中调用它呢?Top
4 楼ppddt008(pp点点通零零发)回复于 2005-04-02 21:26:10 得分 0
在~B调用它,不是吧,你想让程序死循环?Top
5 楼ppddt008(pp点点通零零发)回复于 2005-04-02 21:28:27 得分 0
class B {
protected:
virtual ~B() {
}
};
class D : private B {
public:
static D*
instance() {
if ( !pd_ )
pd_ = new D;
return pd_;
}
static void
close() {
delete pd_;
}
private:
D(const D&);
D&
operator=(const D&);
private:
D* pd_;
};
D* D::pd_ = 0;Top
6 楼ppddt008(pp点点通零零发)回复于 2005-04-02 21:31:43 得分 0
其实我想做的就是生成一些单例类,这些类有很多代码是重复的,所以我就想让他们都继承于B。
但是静态函数有不能使虚函数,看来只能用私有继承了。Top
7 楼bing_huo(我是一个演员!)回复于 2005-04-02 23:48:34 得分 0
既然是singleton 为什么还要new和delete?
static D* instance()
{
static D _d;
return &_d;
}
为什么不这样做呢?
Top
8 楼ppddt008(pp点点通零零发)回复于 2005-04-03 12:56:13 得分 0
upTop
9 楼ppddt008(pp点点通零零发)回复于 2005-04-03 14:54:12 得分 0
upTop
10 楼zhaozhencn(FlyingDonkey)回复于 2005-04-04 08:37:04 得分 0
class B {
public:
virtual void close()
{
delete this;
}
protected:
virtual ~B() {
}
};
class non-copy
{
private: //non-copy(copy construct ,assign operator function
non-copy(const non-copy&)
non-copy& operator=(const non-copy&);
};
class D : public B, public non-copy
{
public:
static D*
instance() {
if ( !pd_ )
pd_ = new D;
return pd_;
}
private:
D* pd_;
};
D* D::pd_ = 0;
上面的代码中,
class B //singleton接口。
class non-copy //non-copy接口
D *p = D::instance( );
......
p->close( );
不过我觉得singleton的代码可不可以不用new在heap中分配空间,这样修改如下:
class D public:
static D*
instance() {
static D s_StaticObject; //不用担心忘记delete 了。这个函数内的静态对象也只会构造一次。
return &s_StaticObject;
}
private:
D(const D&);
D&
operator=(const D&);
};
Top
11 楼zhaozhencn(FlyingDonkey)回复于 2005-04-04 08:38:20 得分 0
class D public,多了一个publicTop
12 楼ppddt008(pp点点通零零发)回复于 2005-04-04 20:54:50 得分 0
up
飞驴好。Top
13 楼zhaozhencn(FlyingDonkey)回复于 2005-04-05 11:48:57 得分 0
可以考虑提供一个类工厂
class CreateStaticObjectFactory
{
protected:
CreateStaticObjectFactory( );
public:
CreateStaticObjectFactory& Instance( )
{
static CreateStaticObjectFactory object;
return object;
}
public:
template<typename T>
T* CreateObject( ) const
{
return T();
}
};
Demo *p = CreateStaticObjectFactory::Instance().CrateObject<Demo>( );
如果对于大量的singleton对象,提供这样一Factory比较适合于集中管理。
Top




