首页 | 博客群 | 公社 | 专栏 | 论坛 | 图片 | 资讯 | 注册 | 帮助 | 博客联播 | 随机访问
BLOG开通- -| 回首页 | 2004年索引 | - -服装采购员的问题

用单件类来代替全局变量

                                      

OO提倡尽量少用全局变量, 我们需要另辟方法来使用全局变量.

      以OO的思维方式, 程序中应该尽量少用全局变量, 因为如果出现大量的全局变量, 而程序中又有许多地方使用它, 势必会造成程序逻辑混乱, 容易出差错. 全局变量的最本质的特性就是在程序运行期间只有一个实例, 程序的其它部分可以任意访问, 这与单件模式的应用场合不谋而和. 单件模式可以确保在程序的运行期间只存在一个类的固定个实例(通常是单个, 这也是单件模式名称的由来). 所以我们完全可以用单件类中的成员变量来代替全局变量, 如果我们把性质相同的全局变量归入同一个单件类中, 在程序中就不会出现大量的全局变量. 如原先需要设计如下的全局变量 :

     int    iVar;
     float  fVar;
     double dVar;
     long   lVar;

   用单件类代替它们, 程序代码可以如下 : 
     class CGlobalVar
     {
     private : 
         static CGlobalVar* _instance;
         int    m_iVar;
         float  m_fVar;
         double m_dVar;
         long   m_lVar;
 
     private :
         CGlobalVar();   // 构造函数私有化, 外界不能直接创建这个类的实例
         {
             _instance = NULL;
             m_iVar = 0;
             m_fVar = 0.0f;
             m_dVar = 0.0;
             m_lVar = 0L;
         }
     
     public :
         static CGlobalVar* CreateInstance()
         {
             if(_instance == null)
             {
                  _instance = new CGlobalVar();
             }
             return _instance;
         } 
   
         int GetIVar() const { return m_iVar; }
         void SetIVar(int iVar) { m_iVar = iVar);
         // 其它Get/Set对  
     }

【作者: bingocao】【访问统计:】【2004年12月9日 星期四 09:48】【注册】【打印

搜索

Google

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=353233

回复

- 评论人:cdpc0202   2007-08-08 11:20:14   

应该是static变量没初始化,你自己初始化不就好了。
CGlobalVar* CGlobalVar::_instance = NULL;

- 评论人:bigboy   2006-12-28 00:10:31   

你可以运行一下你的程序,看有什么结果。这会出现这样一个错误:Linking...
t.obj : error LNK2001: unresolved external symbol "private: static class CGlobalVar * CGlobalVar::_instance" (?_instance@CGlobalVar@@0PAV1@A)
Debug/testsigleclass.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

testsigleclass.exe - 2 error(s), 0 warning(s)
这怎么解释?

验证码:   
评论内容: