zoukankan      html  css  js  c++  java
  • nonmember,nonfriend替换member函数

    non-member,non-friend替换member函数

    C++中资源是按照对象的方式来管理的。就拿我们正在使用的Browser来说,他管理各种各样的资源,其中包括cache,浏览记录,下载的历史记录,Cookies记录以及一些webapp的本地记录。我有个习惯就是会定期的清理一下这些资源。现在就来看看Effective C++中给的一些设计建议吧。

    我们可以不假思索的写出以下的类来:

    复制代码
    class WebBrowser {
    public:
            ......      
        void clearCache();
        void clearHistory();
        void clearCookies();    
            .....
    };
    复制代码

    恩,这就简单实现了一下资源的封装,为了更进一步的封装我们可能会写一个WBManagement类来间接的操作管理WebBrowser里的资源。

    复制代码
    class WBManagement {
        void clearWebBrowser(WebBrowser& wb)
        {
        wb.clearCache();
        wb.clearHistory();
        wb.clearCookies();
        }
    };
    复制代码

    嗯,对资源的封装来说这也是一个不错的方法,在实际工作采取的更多的也是这种方法。不过,C++提供了一个使用起来更顺手的一个东西就是命名空间:

    复制代码
    namespace WebBroserStuff {
    class WebBrowser {
    public:
        void clearCache();
        void clearHistory();
        void clearCookies();    
        };
        void clearWebBrowser(WebBrowser &wb);
    }
    复制代码

    注意了命名空间后面可不像class一样后面后那个分号的呃。

    以上的方法不由得使我想到了C++之父那本书上第十章给出的一些忠告:

      1.只将那些直接访问类成员的那些函数放到成为类的成员函数

      2.使用命名空间,使类与协助函数之间的关系更明确

    如果将类的协助函数放到类中会引来另外两个问题:

      1.使类的界面复杂化,我们在实际的开发中也会遇到别人将接口定义的很复杂的情况,而且给你一大堆的函数让你自己组装。这会浪费掉很多的开发时间,自己写的类然后给别人提供尽可能简单明了的接口是必须的。

      2.当你的类内部发生变化的时候你需要检查的函数就会变多,这让你整个类的弹性就大大的降低

    将协助函数放到namespace 而不是Management中还有一个优点就是,我们可以将namespace 分拆到好几个文件中而class没有这个特性。

     
     
    分类: Effective C++学习笔记

    Effective C++学习笔记

    Effective C++ 学习之------宁以non-member,non-friend替换member函数
    摘要: C++中资源是按照对象的方式来管理的。就拿我们正在使用的Browser来说,他管理各种各样的资源,其中包括cache,浏览记录,下载的历史记录,Cookies记录以及一些webapp的本地记录。我有个习惯就是会定期的清理一下这些资源。现在就来看看Effective C++中给的一些设计建议吧。我们可以不假思索的写出以下的类来:class WebBrowser {public: ...... void clearCache(); void clearHistory(); void clearCookies(); .....};恩,...阅读全文

    posted @ 2013-05-15 21:27 lizhengqian 阅读(26) | 评论 (0) 编辑

    Effective C++ 学习之-------确定对象被使用前被初始化
    摘要: “确定对象的使用前被初始化“毫无疑问这和C++的构造函数有关,对内置类型来说在使用前确保被初始化的最好方式就是在定义一个变量的时候给他一个初始值。而对于自定义类型莫过于类的构造函数了,这相对与C来说的话优雅了很多。 其中将类的成员变量的列表初始化和函数体内初始化,在讲到一下版本的构造函数时个人觉得有点不妥ABEntry::ABEntry(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones){ t...阅读全文

    posted @ 2013-04-16 22:33 lizhengqian 阅读(544) | 评论 (1) 编辑

    Effective C++ 学习之-------尽量以const inline enum 代替#define
    摘要: 记得在大学暑假的时候看过一遍<Effective C++>,由于当时对整个C++的认识比较的肤浅,很难能真正能体会到Effective中的每一点的含义,好像当时就像读小说一样给读过去了。最近重新开始了这本书的实践性学习,在这里记载一些重新读这本书的收获和一些新的认识。其中可能由于自己的认识不够深入,有错误理解的地方,还希望园中各位朋友多多指正。 其中的第一条就不在这里细写了,其中的关键就是分清楚C++是由那几部分组成的,并且明确你正在使用的是那一部分以及各个部分之间有什么联系。自己的目标是以后每周能够好好的细读其中的3-4个主题,而且将每一条的学习进行详细的整理。现在就从第二条开始阅读全文

    posted @ 2013-03-31 18:17 lizhengqian 阅读(48) | 评论 (0) 编辑

  • 相关阅读:
    CentOS 7拨号上网(ADSL & PPPoE)
    linux使用nmcli重新生成网卡配置文件
    Linux 内存缓存占用过大,Centos7设置定时清除buff/cache的脚本
    部署redis6.0 常见问题
    ssh 升级导致的hadoop 主备切换失败
    配置zookeeper的 ACL权限
    sqoop 创建跟mysql相同表结构的hive表报错
    vim中显示不可见字符
    supervisor 使用
    使用hive streaming 统计Wordcount
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3080809.html
Copyright © 2011-2022 走看看