C++如何将void类型函数作为参数传入类的void构造函数
首先修正你原有代码的两处核心问题:
- 构造函数语法错误:C++类的构造函数不允许声明返回值类型,你原有代码里构造函数前的
void必须删除,否则编译会报错 - 缺少回调存储逻辑:如果你需要在构造函数之外(比如
func()成员函数里)调用传入的函数,需要新增成员变量存储回调的地址
方案1:使用C风格函数指针(兼容所有C++版本)
适合只需要传入普通全局函数/静态成员函数的场景,实现代码如下:
#include <iostream> // 定义函数指针类型别名,简化代码书写 typedef void (*ButtonCallback)(); class Button{ private: // 存储回调的成员变量 ButtonCallback m_callback = nullptr; public: // 构造函数直接接收回调参数,初始化成员变量 Button(ButtonCallback func) : m_callback(func) { // 构造函数内也可以直接调用传入的func // if (触发条件满足) { // if(m_callback) m_callback(); // } } void func() { // 非空判断避免传入空指针时崩溃 if(m_callback) { m_callback(); } } }; // 测试用的自定义回调函数 void myOnClick() { std::cout << "按钮点击回调触发" << std::endl; } int main() { // 实例化对象时直接传入函数名即可 Button testBtn(myOnClick); // 调用func时会执行你传入的自定义逻辑 testBtn.func(); return 0; }
方案2:使用C++11及以上版本的std::function(更灵活)
支持传入普通函数、lambda表达式、绑定了对象的类成员函数等多种可调用对象,适配更复杂的业务场景:
#include <iostream> #include <functional> class Button{ private: std::function<void()> m_callback; public: // 用std::move转移所有权减少拷贝开销 Button(std::function<void()> func) : m_callback(std::move(func)) {} void func() { if(m_callback) { m_callback(); } } }; int main() { // 示例:直接传入lambda作为回调 Button testBtn([](){ std::cout << "lambda回调触发成功" << std::endl; }); testBtn.func(); return 0; }
内容的提问来源于stack exchange,提问作者user16948370
相关产品推荐
相关产品推荐

