游戏开发论坛

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

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

[复制链接]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

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

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

呵呵,是的,我刚刚也想到这个问题了。。
他的做法确实在内存中会两份拷贝,因为他的instance没有被声明为
static,所以在instance的时候,会呼叫到singleton这个类会构造。

如果声明为static的话,则传入的类不会进行构造了,因为static是
class independent的。其实通过继承来构造就必然会导致有两份类
的拷贝,所以还是用new是实现构造的好。。。

对了,这里怎么打字打着打着就自动发表了?搞得每次都要点修改。

28

主题

685

帖子

703

积分

高级会员

Rank: 4

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

instance()函数是静态的,所以Singleton不会被再构造。

rt

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

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

Here's my final statement..

singleton会被构造一次的。
因为他是写的:
static singleton<T> s_oT;

这里会先对singleton进行构造,由于singleton又是继承T的,所以这里会产生一份拷贝。

28

主题

685

帖子

703

积分

高级会员

Rank: 4

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

测试一下估计就可以了。这是例子。

#include <iostream>

template<class T>
class singleton: private T
{
private:
        singleton(){}
        ~singleton(){}

public:
        static T &instance()
        {
                static singleton<T> s_oT;
                return(s_oT);
        }
};

struct TestB
{
public:
        TestB()
        {
                std::cout<<"run once"<<std::endl;
        }
};
int main(int argc, char* argv[])
{
        TestB &B=singleton<TestB>::instance();
        singleton<TestB>::instance();
        return 0;
}

28

主题

685

帖子

703

积分

高级会员

Rank: 4

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

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

假如main函数中是这样的,那么这个TestB就不会被构造。
int main(int argc, char* argv[])
{
//TestB &B=singleton<TestB>::instance();
//singleton<TestB>::instance();
return 0;
}

假如你觉得有可能因为构造函数造成没打出来可以这样试:
#include <iostream>

template<class T>
class singleton: private T
{
private:
        singleton(){}
        ~singleton(){}

public:
        static T &instance()
        {
                static singleton<T> s_oT;
                return(s_oT);
        }
};

struct TestB
{
public:
        TestB()
        {
                i++;
                std::cout<<"run "<<i<<std::endl;
        }
        void f()
        {
                std::cout<<i<<std::endl;
        }
        static int i;
};
int TestB::i=0;
int main(int argc, char* argv[])
{
        TestB &B=singleton<TestB>::instance();
        singleton<TestB>::instance();
        B.f();
        return 0;
}

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

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

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

你是对的,我用F10跟了一次。
确实没有两次构造。

是我开始理解错了。
看了一下这样做编译出来的汇编代码和用new生成的汇编代码。
这样做到是少了很多汇编语句。

78

主题

194

帖子

194

积分

注册会员

Rank: 2

积分
194
 楼主| 发表于 2004-9-9 19:46:00 | 显示全部楼层

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

汗!是该好好像各位大虾学习学习。我写的时候压根没有仔细考虑,只是想到什么就怎么写了。没想到有这么多方法。
但是我最想问的那个问题到现在还没有解决哩!

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-9-9 20:45:00 | 显示全部楼层

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

不要使用宏。

78

主题

194

帖子

194

积分

注册会员

Rank: 2

积分
194
 楼主| 发表于 2004-9-10 13:37:00 | 显示全部楼层

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

使用宏会导致不可见吗?没道理啊

2

主题

21

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2004-9-18 10:53:00 | 显示全部楼层

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

还是细节问题~
class EXPORT A
{
     DECLARE_SINGLEOTON
}
不知是笔误否,
应是DECLARE_SINGLEOTON(A)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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