zoukankan      html  css  js  c++  java
  • 读书笔记_Effective_C++_条款三十五:考虑virtual函数以外的其他选择

    看书走一遍  effective  c++

    使用bind function  取代虚函数吗 

    虚函数实现策略模式   使用bind + function实现策略模式     策略模式  不用讲了吧  

    https://www.cnblogs.com/qicosmos/p/4527804.html

    两种 实现  策略模式的方法   一种使用虚函数  一种使用bind function 方法  对比  

    #include<iostream>
    #include<functional>  
    
    using namespace std;
    using std::placeholders::_1;//解决bind 站位符号 看cpp primer   标准bind  那里有讲解
    using std::placeholders::_2;
    
    //1.虚函数方式实现策略模式
    class Calculater
    {
    public:
        virtual int calculate(int x, int y) = 0;
    };
    
    class Minus : public Calculater
    {
    public:
        int calculate(int x, int y) 
        {
            return x - y;
        }
    };
    
    class Plus : public Calculater
    {
    public:
        int calculate(int x, int y) 
        {
            return x + y;
        }
    };
    
    class CalcuClient
    {
    private:
        Calculater* m_caculater;
    public:
        CalcuClient(Calculater* caculater) : m_caculater(caculater){}
    
        int calculate(int x, int y)
        {
            return m_caculater->calculate(x, y);
        }
    };
    
    //使用  2.bind+function方式实现策略模式
    class NewCalcuClient
    {
    private:
        std::function<int(int, int)> m_function;
       // std::function<int(int, int, double)> m_function1;
    
    public:
        NewCalcuClient(std::function<int(int, int)> function) : m_function(function){}
        //NewCalcuClient(std::function<int(int, int, double)> m_function1) : m_function_other(function){}
        
        int calculate(int x, int y)
        {
            return m_function(x, y);
        }
    };
    
    int main(){
        Minus minus;// -
        CalcuClient client(&minus);//传入一个派生类的对象的引用  到参数为基类指针的构造函数中去   基类指针调用虚函数  即虚基类 的虚函数
    
        Plus plus;// +
        CalcuClient client2(&plus);
    
        int r = client.calculate(7, 4);
        int r2 = client2.calculate(7, 4);
        cout<<"r= "<<r<<endl;
        cout<<"r2= "<<r2<<endl;
    
        //bind+function
        NewCalcuClient newclient(bind(&Minus::calculate, &minus, _1, _2));
        NewCalcuClient newclient2(bind(&Plus::calculate, &plus, _1, _2));
    
        int r3 = newclient.calculate(7, 4);
        int r4 = newclient2.calculate(7, 4);
        cout<<"r3= "<<r3<<endl;
        cout<<"r4= "<<r4<<endl;
        
        return 0;
    }
  • 相关阅读:
    hbase深入了解
    Android SDK安装与环境变量配置以及开发第一个Android程序
    Android平台架构及特性
    android Notification定义与应用
    Windows Phone 7 开发 31 日谈——第1日:项目模板
    MVC HtmlHelper类的方法总结(转)
    INotifyPropertyChanged的使用
    浅谈计算机软件的破解与保护(时间:20111224作者:李富云 来源:中国论文库)
    托管代码&非托管代码
    .net也疯狂:生成zip文件(转)
  • 原文地址:https://www.cnblogs.com/zhangkele/p/10639938.html
Copyright © 2011-2022 走看看