C++ 类中函数指针的使用

函数指针用法

函数指针可以作为一个函数的参数,传不同的函数指针给这个函数就可以让其实现不能的功能。从而我们可以复用这个函数剩余的大部分结构,而不用设计两个只有一点点不同的函数。

举个简单的例子,==假如!!!==我这个math函数还有很多操作(发挥下想像力),只有一小部分不同,一个要得到加法结果、一个要得到乘法结果,那么我完全可以只设计一个math函数,把不同的部分(加、乘)拿出去,按照实际情况调用不同功能函数的指针进math函数就行了。如下:

第一行,函数指针声明:typedef int (*f_ptr)(int, int);,结果看上去很像函数声明 返回值 函数名 (参数列表)
不同但是函数名用 (* 函数指针类型名),这行代码让我们得到了一个名为f_ptr类型的函数指针,这个其对应函数返回值是int ,接收两个int参数。你可以把它看作跟int、float这些默认类型一样的东西,是个变量类型,是不过它是函数指针类型的变量。

另外,函数名就是函数指针,传值的时候传函数名即可。

#include<iostream>
using namespace std;
typedef int (*f_ptr)(int, int);

int math(f_ptr f, int a, int b)
{
	return f(a, b);
}


int sum(int a, int b)
{
	return a + b;
}
int mul(int a, int b)
{
	return a * b;
}
int main()
{
	
	int x = 10, y = 20;
	cout<<"10 + 20 = "<<math(sum, x, y)<<endl;
	cout<<"10 * 20 = "<<math(mul, x, y)<<endl;
	return 0;
}

类中的成员函数接收函数指针

工程中一般会定义各种各样的类,然后一顿操作,最近写一个工程,把函数指针用在类中的成员函数就不好使了,各种各样的错误,记录一下

情况1

同成员函数使用全局函数的函数指针,这种最简单实现

A类中的_a成员函数调用全局函数g_b的函数指针,无坑~~~

#include<iostream>

using namespace std;

typedef int (*f_ptr)(int, int);

class A
{
public:
	void _a(f_ptr sum,int a,int b)
	{
		cout << "10 + 20 = "<<sum(a, b) << endl;
	}
};

int g_b(int a, int b)
{
	return a + b;
}

int main()
{
	A a;
	int x=10,y=20;
	a._a(g_b, x, y);	
	return 0;
}

情况2

类中的成员函数使用类内中另一个成员函数的指针,有坑:类内另一个成员函数必须要是静态成员函数(对这个名词不太熟悉可以参考下面链接)
关于静态成员函数和静态成员变量的说明

注意静态成员函数指针调用 类名::函数名

#include<iostream>

using namespace std;

typedef int (*f_ptr)(int, int);

class A
{
public:
	void _a(f_ptr sum,int a,int b)
	{
		cout << "10 + 20 = "<<sum(a, b) << endl;
	}

	static int _b(int a, int b)
	{
		return a + b;
	}

};


int main()
{

	A a;

	int x=10,y=20;
	a._a(A::_b, x, y);

	return 0;
}

情况3

情况3和情况2类似
注释那种使用是不行的,大家可以试试。

类中的成员函数使用另一个类中成员函数的指针,有坑:另一个类中的成员函数必须也要是静态成员函数

#include<iostream>

using namespace std;

typedef int (*f_ptr)(int, int);

class A
{
public:
	void _a(f_ptr sum,int a,int b)
	{
		cout << "10 + 20 = "<<sum(a, b) << endl;
	}

};

class B
{
public:
	static int _b(int a, int b)
	{
		return a + b;
	}
		
};

int main()
{	
	A a;

	int x=10,y=20;
	a._a(B::_b, x, y);
	// B b;
	//a._a(b._b, x, y);
	return 0;
}

总结

想要使用某个函数的指针,这个函数必须是全局函数或者是静态成员函数,否则就拿不到它的指针!无论这个函数是同类或者不同类的都不行!


版权声明:本文为L1778586311原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。