- 函数指针是指向函数的指针变量,它可以用来
存储函数的地址
,从而允许在程序中动态地调用不同的函数。 - 定义函数指针的一般语法如:返回类型 (*指针变量名)(参数类型1, 参数类型2, …); // void (*failedCallBack)(int)
- 回调函数: 函数指针常用于实现回调机制,其中一个函数作为参数传递给另一个函数,以便在特定事件发生时调用。比如,在图形界面库中,可以通过函数指针来定义按钮点击事件的处理函数。
void btnListenerSuccess() {
std::cout << "btnListenerSuccess" << std::endl;
}
void btnListenerFailed(int code) {
std::cout << "btnListenerFailed" << std::endl;
}
void RegisterButtonClick(void (*successCallBack)(), void (*failedCallBack)(int)) {
successCallBack();
failedCallBack(100);
}
int main() {
RegisterButtonClick(btnListenerSuccess, btnListenerFailed);
return 0;
}
- 策略模式: 函数指针可以用于实现策略模式,通过在运行时选择不同的函数来改变算法的行为。
typedef int (*MathOperation)(int, int);
int Add(int x,int y) {
return x + y;
}
int Subtract(int x, int y) {
return x - y;
}
int Calculate(MathOperation operation, int x, int y) {
return operation(x, y);
}
int main() {
MathOperation addFunc = Add;
MathOperation subtractFunc = Subtract;
std::cout << "Addition result: " << Calculate(addFunc, 5, 3) << std::endl;
std::cout << "Subtraction result: " << Calculate(subtractFunc, 8, 4) << std::endl;
std::cout << "Hello, World!" << std::endl;
return 0;
}
- 动态加载函数库: 函数指针可以用于动态加载共享库(动态链接库)中的函数,从而实现插件式架构。
#include <iostream>
#include <dlfcn.h>
typedef void (*PluginFunction)();
int main() {
std::string currentPath = __FILE__;
size_t lastSlash = currentPath.rfind('/');
std::string libraryPath = currentPath.substr(0, lastSlash + 1) + "libTest.so";
std::cout << "so libraryPath: "<< libraryPath << std::endl;
std::string libraryPathUntitled = currentPath.substr(0, lastSlash + 1) + "libuntitled.dylib";
std::cout << "dylib libraryPathUntitled: "<< libraryPathUntitled << std::endl;
void* pluginHandle = dlopen(libraryPathUntitled.c_str(), RTLD_LAZY);
std::cout << "pluginHandle: "<< pluginHandle << std::endl;
if (pluginHandle) {
PluginFunction pluginFunc = (PluginFunction)dlsym(pluginHandle, "hello");
std::cout << "pluginFunc: "<< pluginFunc << std::endl;
if (pluginFunc) {
pluginFunc();
} else {
std::cout << "Failed to find function in plugin." << std::endl;
}
dlclose(pluginHandle);
} else {
std::cout << "Failed to load plugin." << std::endl;
}
return 0;
}