【C++学习笔记】Step4 函数指针

目的学习并掌握函数指针的概念与使用方法。

码云:https://gitee.com/hinzer/my-notes-of-C_plus

 

思维导图:

本质是一个指针(地址),指向某个函数的地址(函数名是作为函数地址)

 

 

函数指针

通过在基类中声明一个函数指针的原型,子类的构造函数中实现对指针的初始化,并调用指针所指向的方法。

#include "iostream"


using namespace std;
class Object;
typedef void(Object::*CallaterHandler)();    //通过typedef将复杂的声明 取个别名


class Object
{//定义基类
public:
	void (Object::*sayHi)();
};

#define CH(fp) (CallaterHandler)(&fp)	//将函数fd转换成函数指针类型

class Hello:public Object
{//Hello 为子类
public:
	Hello()
	{//在子类构造方法中,初始化函数指针
		sayHi = CH(Hello::sayHello);		//将sayHello函数 强转为函数指针类型
		(this->*sayHi)();	//调用指针

	}
	void sayHello()
	{//接口1
		cout << "hello hinzer" << endl;

	}


};

int main(int argc, char const *argv[])
{
	Hello p;

	return 0;
}


 

编译并运行

g++ demo.cpp -lpthread -std=c++11 -o demo

 

应用Ⅰ多线程调度

将目标方法以函数指针的形式传入函数的参数表中,  函数callater作为一个线程由系统调度。具体实现是系统等待3s再执行sayHello方法。

#include "iostream"
#include "thread"
#include "unistd.h"

using namespace std;
class Object;
typedef void(Object::*SayHi)();
typedef void(Object::*CallaterHandler)();

void threadFunc(Object *target,CallaterHandler handler,int delay);
void callater(Object *target,CallaterHandler handler,int delay);



class Object
{//定义基类
public:
	void (Object::*sayHi)();
};

#define CH(fp) (CallaterHandler)(&fp)	//将函数fd转换成函数指针类型

class Hello:public Object
{//Hello 为子类
public:
	Hello()
	{//在子类构造方法中,初始化函数指针
		
		callater(this,CH(Hello::sayHello),3);		//等待3s后,实现sayHell方法
		// sayHi = CH(Hello::sayHello);		//将sayHello函数 强转为函数指针类型
		// (this->*sayHi)();	//调用指针

	}
	void sayHello()
	{//接口1
		cout << "hello hinzer" << endl;

	}


};


int main(int argc, char const *argv[])
{

	Hello p;

	return 0;
}


void threadFunc(Object *target,CallaterHandler handler,int delay)
{//等待 delay 时间,再执行函数
    sleep(delay);
    (target->*handler)();
}
void callater(Object *target,CallaterHandler handler,int delay)
{//设置线程,将函数交给系统调度
    thread t(threadFunc,target,handler,delay);
    t.join();
}

 

编译并运行

g++ main.cpp -lpthread -std=c++11 -o app

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hinzer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值