游戏开发论坛

 找回密码
 立即注册
搜索
楼主: 星の海

Lib中的static变量怎么会对外不可见

[复制链接]

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-8 16:11:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

。。。你贴了两种实现方法是吧。。
第一种用继承的方法没多内存。。。
第二种多了个
static object_creator create_object;
//这个类什么事情也不做,好的编译器能优化掉,不占空间。

不过第一种方法为什么要private继承呢?
如果直接用class singleton: public T继承的话,就可以直接用
singleton<XXX>::instance()来获得singleton实体
//这样做好像也可以这样来获得。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-9-8 16:30:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

。。。一个struct里面就算是两个函数指针也有8个字节。。。
呵呵,这个不讨论了,再讨论下去,估计我要钻牛角尖了。

另外一个,private继承的话,因为你是用的:
static singleton<T> s_oT;
来返回一个东西,所以会导致instance()无法访问到T的public的函数。
如果用 static T s_oT;这样会好一些。

不过有一点我还是没弄明白,你的singleton那个类的构造和构析
为什么要用private,构造还好理解,因为是在类的内部构造的。
那么构析呢?应该不是发生在内部吧?我都怀疑这样是否能编译通过。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-9-8 16:35:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

另:

用xxx a = singleton<xxx>::instance();
这样的话,是可以访问到xxx的东西。不过如果用:
singleton<xxx> a = singleton<xxx>::instance()呢?
这样的构造函数也暴露在外面了,而且也无法正常的访问a

故意要防止这样?用意何在?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-9-8 16:42:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

。。。。。得了,我看错了。。
static T &instance();
你这里是用T做的返回值,刚刚没看到,寒自己一个。

算我没说,不过private的构析应该还是会有问题的。

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-8 16:43:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

singleton<xxx> a = singleton<xxx>::instance()呢?

为什么要这么用呢?
xxx a = singleton<xxx>::instance();
不就已经足够了吗?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-9-8 16:45:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

恩,看出问题来了,我就讲感觉怎么那么别扭。。。
这样打个比方,比如有个类:
class A {
    char buf[65535];
    ...
};

然后定义一个宏:
#define SINGLETON(x) (singleton<x>::instance())

那么在用SINGLETON(A)的时候,实际上内存中有两个char buf[65535];
原因很简单,你自己想想吧,本身singleton这个类就是A的子类,自然
继承了buf这个数据,后来又在instance()里面用static生成一个。

我就说想起来有些别扭,刚刚就讲不出哪别扭了。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-9-8 17:06:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

完全没那么复杂的,这里给出个简单版本的适合任意类的SINGLETON实现方案:

template<class T>
class singleton
{
public:
    static T *instance() {
        static T *ob = 0;
        if(!ob) ob = new T();  
        return ob;
    }
};

#define SINGLETON(x) (singleton<x>::instance())

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-8 17:07:00 | 显示全部楼层

但我这个SINGLETON本身是不存在的。虽然从那个继承了,但

rt

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-8 17:09:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

template<class T>
class singleton
{
public:
    static T *instance() { static T ob; return &ob; }
};
这个的构造析构为了保险,最好是私有的,省得有的用户自己又创建一个。

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-8 17:11:00 | 显示全部楼层

Re:Lib中的static变量怎么会对外不可见

具体有的地方为什么要这么写,我也不是很清楚,因为我是直接COPY的BOOST里面的实现,上面说是为了保证他被正确的初始化。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-18 17:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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