首先描述一个情景:
先贴出代码:
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指针。