zoukankan      html  css  js  c++  java
  • 使用虚函数,减少累赘的if/else/switch

    假设我们有不同的对象需要管理,我们可能建立一个类来包装一下实现对这些不同类型对象的管理,比如
    class CObjManager
    {
        public:
            bool     addObj_A(string const & strObjName,Other_params...);
            bool     addObj_B(string const & strObjName,Other_params...);
            .......
            bool     updateAllObj();
    }
    用add函数将对象添加到管理器内,然后在更新对象时,用updateAllObj()更新对象的数据,这么的话,update可能需要这么写

    bool     CObjManager::updateAllObj()
    {
        for(i=0 to num of object)
        {
            switch(object.type)
            {
                case A:
                    ...
                    break;
                case B:
                    ...
                    break;
                ...
            }
        }
    }

    我们可以这样使用这个管理器:

    CObjManager  objManager;
    objManager.addObj_A("This is object A",others...);
    objManager.addObj_B("This is object B",others...);
    在需要更新对象时,执行
    objManager.updateAllObj()
    即可

    有没有觉得CObjManager::updateAllObj函数写得太难看了,尤其是当对象类型很多时更是如此。
    下面看用虚函数怎么做这件事,完全不用这么多switch
    首先定义一个对象的虚基类
    class     CObjBase()
    {
        public:
            CObjBase(string const & strObjName);
            virtual    bool    update()=0;
    }
    其中uodate为对象的更新函数,对于对象A来说,可以这么写
    class     CObj_A():public CObjBase
    {
        public:
            CObj_A(string const & strObjName,Other_params...):CObjBase(strObjName)
            {...}
            virtual    bool    update()
            {
                ...
            }
    }
    然后写一个对象管理器,如下
    class CObjManager
    {
        public:
            bool     updateAllObj()
            {
                for each obj
                    obj.update();
            }
            bool    addObj(CObjBase    * pObj);
           
           ~CObjManager()
           {
            for each object
                delete object
           }
    }
    看到没有,这里的updateAllObj完全不用管对象具体是哪一个类型,这些繁琐的事情让c++干吧!
    可以这么使用这个对象管理器
    CObjManager  objManager;
    objManager.addObj(new CObj_A("This is Obj A",..other param..));
    objManager.addObj(new CObj_B("This is Obj B",..other param..));
    在需要更新对象时,执行
    objManager.updateAllObj()
    即可
    看,用起来还是很方便,但是看起来写起来却漂亮了很多,当需要增加新的类型时,只需要添加一个类就行了。。。

  • 相关阅读:
    C++ 中的深入浅拷贝和深拷贝
    C++ 引用小问题
    6-10
    6-8
    6-7
    6-4
    6-3
    6-1
    5-31
    COMException 依赖服务或组无法启动(0x8007042C)处理办法
  • 原文地址:https://www.cnblogs.com/cutepig/p/1310314.html
Copyright © 2011-2022 走看看