设计思路
- 成员函数指针:使用成员函数指针来存储不同的成员函数,以便在运行时根据条件进行调用。
- 函数对象:封装成员函数指针,通过函数对象的方式来实现调用,这样可以更方便地进行管理和传递。
- 线程安全:使用互斥锁(
std::mutex
)来保护共享资源,确保在多线程环境下的安全访问。
- 高效内存管理:使用智能指针(
std::unique_ptr
或 std::shared_ptr
)来管理对象和函数对象,避免内存泄漏。
关键代码实现
#include <iostream>
#include <functional>
#include <mutex>
#include <memory>
class MyClass {
public:
void func1() {
std::cout << "func1 called" << std::endl;
}
void func2() {
std::cout << "func2 called" << std::endl;
}
using FuncPtr = void (MyClass::*)();
using FuncObj = std::function<void()>;
// 线程安全调用成员函数
void callFunction(FuncPtr func, std::unique_lock<std::mutex>& lock) {
(this->*func)();
}
// 根据条件选择并调用成员函数
void execute(int condition) {
static std::mutex mtx;
std::unique_lock<std::mutex> lock(mtx);
FuncObj funcObj;
if (condition == 1) {
funcObj = std::bind(&MyClass::func1, this);
} else if (condition == 2) {
funcObj = std::bind(&MyClass::func2, this);
}
if (funcObj) {
funcObj();
}
}
};
int main() {
std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();
obj->execute(1);
obj->execute(2);
return 0;
}
代码说明
- MyClass:定义了两个成员函数
func1
和 func2
,以及用于存储成员函数指针的类型别名 FuncPtr
和用于封装成员函数调用的函数对象类型别名 FuncObj
。
- callFunction:通过成员函数指针调用成员函数,并使用
std::unique_lock
确保线程安全。
- execute:根据传入的条件,选择相应的成员函数,并使用函数对象进行调用,同时使用互斥锁保护共享资源。
- main:创建
MyClass
对象,并根据不同条件调用 execute
函数,展示动态调用不同成员函数的功能。