目的学习并掌握函数指针的概念与使用方法。
码云: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