面试题答案
一键面试以下是实现安全调用该成员函数指针的机制代码:
#include <iostream>
class MyClass {
public:
void memberFunc(int param) {
std::cout << "memberFunc called with param: " << param << std::endl;
}
};
// 安全调用函数
void safeCall(MyClass* obj, void (MyClass::*memberFuncPtr)(int), int param) {
if (obj && memberFuncPtr) {
(obj->*memberFuncPtr)(param);
}
}
你可以通过以下方式调用:
int main() {
MyClass* obj = nullptr;
void (MyClass::*memberFuncPtr)(int) = &MyClass::memberFunc;
safeCall(obj, memberFuncPtr, 42);
obj = new MyClass();
safeCall(obj, memberFuncPtr, 42);
delete obj;
return 0;
}
原理解释
- 条件判断:在
safeCall
函数中,首先判断obj
(对象指针)和memberFuncPtr
(成员函数指针)是否为空。只有当两者都不为空时,才进行成员函数的调用。 - 成员函数调用语法:
(obj->*memberFuncPtr)(param)
这种语法用于通过对象指针obj
来调用指向的成员函数memberFuncPtr
,并传递参数param
。当obj
为空或者memberFuncPtr
为空时,不进行调用,从而避免程序崩溃。