You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何将void类型函数作为参数传入类的void构造函数

C++ Button类传入回调函数解决方案

首先修正你原有代码的两处核心问题:

  • 构造函数语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:09:01