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" <& ...
随机推荐
- BZOJ 1486 最小圈(01分数规划)
好像是很normal的01分数规划题.最小比率生成环. u(c)=sigma(E)/k.转化一下就是k*u(c)=sigma(E). sigma(E-u(c))=0. 所以答案对于这个式子是有单调性的 ...
- NOIP1998 提高组
[NOIP2002] 提高组 T2.联接数 算法:贪心+字符串处理 [问题分析]: 按整数对应的字符串大到小连接,因为题目的例子都符合,但是不难找到反例:12 121 应该组成12121而非121 ...
- Linux特殊字符含义
文件名以 ' . ' 开头的都是隐藏文件或目录,只需要在文件或目录名前添加 ' . ' 就可以隐藏它 ~ 表示主目录 . 当前目录 . . ...
- PowerDesigner 建表语句没出现字段描述
填写了Name 还是没有 修改步骤如下:
- 【题解】CF#229 E-Gifts
尽管是一道E题,但真心并不很难~不难发现,有一些物品是一定要被选择的,我们所需要决策的仅仅只有那几个有重复价值的物品. 而不同名字之间的概率并不互相影响,所以我们有 \(f[i][j]\) 表示名字为 ...
- hihoCoder#1838 : 鎕鎕鎕 贪心
---题面--- 题解: 神奇的贪心题,,,感觉每次做贪心题都无从下手... 我们首先按照a对所有卡片从小到大排序,然后从1开始,从连续的两张牌中取b最大的,最后一张单出来的也取了. 可以证明,这样的 ...
- 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
- MEMCACHE用法详解
MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度. Me ...
- EurekaServer集群配置
一.程序配置 1.pom添加依赖: <dependency> <groupId>org.springframework.cloud</groupId> <ar ...
- ACE_Message_Block功能简介
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607960.html ACE_Message_Block在Ace中用来表示消息的存放空间 ...