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

码云: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

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐