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 ;
}
private:
int test = ;
};
类成员函数对数组进行排序,排序使用的是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 ;
}
private:
int test = ;
};
方法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 ;
}
private:
int test = ;
};
现在考虑,如果在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 ;
}
private:
int test = ;
};
对于类中的非静态成员函数而言,其第一个参数是默认的this指针,接下来是显式声明的形参,通过bind绑定器,为函数compare设置默认参数,第一个为this,剩余两个为占位符,这样
在sort函数中直接调用新函数指针ff,就可调用compare并默认传入了当前对象的this指针。
bind类成员函数的更多相关文章
- boost::function 通过boost::bind调用类成员函数
1. 首先引用boost::function和boost::bind的头文件和库: #include "boost/bind.hpp" #include "boost/f ...
- C/C++ 类成员函数指针 类成员数据指针
普通函数指针: "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...
- 重载运算符:类成员函数or友元函数
类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...
- C++类成员函数的重载、覆盖和隐藏区别?
C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...
- C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数
getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即 cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...
- C++的类成员和类成员函数指针
类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...
- python 类成员函数
http://cowboy.1988.blog.163.com/blog/static/75105798201091141521583/ 这篇文章总结的非常好 主要注意的地方是 1,在类内调用成员函数 ...
- ### C++总结-[类成员函数]
C++类中的常见函数. #@author: gr #@date: 2015-07-23 #@email: forgerui@gmail.com 一.constructor, copy construc ...
- C++:类成员函数的重载、覆盖和隐藏区别?
#include <iostream> class A { public: void func() { std::cout << "Hello" <& ...
随机推荐
- Java字符串2
if(str!= null && str.isEmpty()){ dao.get(str); } str.isEmpty判断字符串是否为空字符串
- Hibernate学习实现查询
- springBoot @EnableAutoConfiguration深入分析
1.新建一个项目中需要提供配置类 2.在META-INF/spring.factorties在文件中配置 org.springframework.boot.autoconfigure.EnableAu ...
- BZOJ 3507 通配符匹配(贪心+hash或贪心+AC自动机)
首先可以对n个目标串单独进行处理. 对于每个目标串,考虑把模式串按'*'进行划分为cnt段.首尾两段一定得于原串进行匹配.剩下的cnt-2段尽量与最靠左的起点进行匹配. 对于剩下的cnt-2段.每段又 ...
- WC2017 划水记
Day 0 (2.2) 一寒假没有好好写题....于是晚上打了人生第一场codeforces,写了Div2三道水题就弃疗了23333333 Day 1 (2.3) 从德州高铁站坐小火车G57去绍兴 ...
- CF997B Roman Digits
题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 题目描述 You are given an unweighted ...
- 【题解】SCOI2008配对
贪心+dp~观察数据,发现一个规律:将数字排序之后,最优匹配只可能产生在该数字和与它距离不超过二的数字之间. 所以可以用dp[i]代表前i个数(排序)匹配的最小差值,之后暴力选出该新数应该如何匹配. ...
- 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III
题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ...
- 20165218 实验一 Java开发环境的熟悉
实验一 Java开发环境的熟悉 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.2 实验密级:Java开发环境的熟悉 实验内容.步骤与体会: ( ...