能否通过构造函数传入自定义函数实现C++类内函数指针调用?
你的代码完全可行!
嘿,先给你个肯定的答复:你写的这段代码逻辑是通顺的,完全可以实现你想要的功能——让用户提供一个自定义函数,通过构造函数传给类,然后在类的方法里调用它。
核心逻辑为啥没问题?
咱拆解一下代码的关键点:
- 你在
MyClss里定义的私有成员bool (*f)();是一个函数指针,它的类型正好匹配“无参数、返回值为bool”的函数,语法完全正确。 - 构造函数
MyClss(bool (*fp)())接受同类型的函数指针参数,并且把它赋值给成员变量f,这一步的赋值逻辑没有问题。 - 在
MyMethod里调用f(),只要构造对象时传入了有效的函数指针,这里就能正常执行用户实现的自定义逻辑。
几个要注意的细节
虽然代码可行,但有几个点可以优化或者需要警惕:
- 空指针风险:如果构造时传入的是
nullptr(空指针),调用f()会触发未定义行为,程序大概率崩溃。建议在构造函数里加个检查:MyClss::MyClss(bool (*fp)()) : f(fp) { if (!fp) { // 可以抛出异常或者做其他错误处理 throw std::invalid_argument("Function pointer can't be null!"); } } - 类名拼写:你写的类名是
MyClss(少了一个字母a),虽然语法上不影响编译,但改成MyClass会更符合常规命名习惯,避免后续阅读代码时混淆。
更现代的替代方案(C++11及以后)
如果你的项目使用C++11或更高版本,更推荐用std::function来替代原始的函数指针,它的灵活性更强:
- 不仅能接受普通函数,还能接受lambda表达式、绑定的类成员函数、仿函数等。
- 代码可读性也更好。
给你个示例代码参考:
#include <functional> #include <stdexcept> class MyClass { private: std::function<bool()> f; public: MyClass(std::function<bool()> fp); void MyMethod(); }; MyClass::MyClass(std::function<bool()> fp) : f(std::move(fp)) { if (!f) { throw std::invalid_argument("Function object can't be empty!"); } } void MyClass::MyMethod() { // 先执行一些前置任务 if(f()) { // 如果用户函数返回true,执行后续任务 } } // 使用示例 bool userDefinedFunc() { return true; } int main() { // 传入普通函数 MyClass obj1(userDefinedFunc); // 传入lambda表达式 MyClass obj2([](){ return false; }); obj1.MyMethod(); obj2.MyMethod(); return 0; }
内容的提问来源于stack exchange,提问作者MAB
相关产品推荐
相关产品推荐

