zoukankan      html  css  js  c++  java
  • bind类成员函数

    首先描述一个情景:

    先贴出代码:

    class Solution
    {
    public:
        bool compare(int a, int b)
        {
            return a > b;
        }
    
        int function_t(vector<int> &numbers)
        {
            sort(numbers.begin(), numbers.end(), compare);
            for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
                cout<<*iter<<endl;
            return 0;
        }
    private:
        int test = 1000;
    };

    类成员函数对数组进行排序,排序使用的是STL自带的sort函数。上述代码无法编译通过,因为对于sort而言,第三个参数是自定义的比较函数,其函数不能够为一个非静态类成员函数。

    如果需要使用compare,可以有两种方案,第一种,将compare函数声明为全局函数;第二种,将compare函数设置为static静态函数。

    方法1:

    bool compare(int a, int b)
    {
        return a > b;
    }
    
    class Solution
    {
    public:
        int function_t(vector<int> &numbers)
        {
            sort(numbers.begin(), numbers.end(), compare);
            for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
                cout<<*iter<<endl;
            return 0;
        }
    private:
        int test = 1000;
    };

    方法2:

    class Solution
    {
    public:
        static bool compare(int a, int b)
        {
            return a > b;
        }
    
        int function_t(vector<int> &numbers)
        {
            sort(numbers.begin(), numbers.end(), compare);
            for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
                cout<<*iter<<endl;
            return 0;
        }
    private:
        int test = 1000;
    };

    现在考虑,如果在compare函数中,需要使用类私有变量test,则上述两种方法都无法完成。对于类static成员函数,是不能够操作类成员函数和变量的(类成员函数的第一个默认参数是this指针,但static函数没有this指针),一般的做法,是将this指针传入static函数。例如:

    static bool compare(int a, int b, Solution *arg)
    {
        Solution *p = (Solution *)arg;
        cout<<p->test<<endl;
        p->test++;
        return a > b;
    }
    
    compare(a, b, this);

    这样在类静态函数compare中就可以操作当前对象的test变量。但对于sort排序函数而言,如何实现对this指针的传参?

    解决方案:使用bind绑定器,关于bind绑定器的介绍就不在一一展开,这篇博文主要是阐述如何在类成员函数中操作类私有变量。

    代码:

    class Solution
    {
    public:
        bool compare(int a, int b)
        {
            test++;
            return a > b;
        }
    
        int function_t(vector<int> &numbers)
        {
            auto ff = bind(&Solution::compare, this, placeholders::_1, placeholders::_2);
            sort(numbers.begin(), numbers.end(), ff);
            cout<<test<<endl;
            for (auto iter = numbers.begin(); iter != numbers.end(); ++iter)
                cout<<*iter<<endl;
            return 0;
        }
    private:
        int test = 1000;
    };

    对于类中的非静态成员函数而言,其第一个参数是默认的this指针,接下来是显式声明的形参,通过bind绑定器,为函数compare设置默认参数,第一个为this,剩余两个为占位符,这样

    在sort函数中直接调用新函数指针ff,就可调用compare并默认传入了当前对象的this指针。

  • 相关阅读:
    Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享
    Shiro权限管理框架(一):Shiro的基本使用
    【自动化__持续集成】___java___finally
    【自动化__持续集成】___java___异常处理
    【自动化__持续集成】___java___static
    【自动化__持续集成】___java___对象
    【自动化__持续集成】___java___代码非空指针
    【自动化__持续集成】___java___代码空指针
    【自动化__持续集成】___java___失血模型
    【自动化__持续集成】___java___构造方法
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/8398740.html
Copyright © 2011-2022 走看看