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

C++中为类设置可变更函数属性的实现方法

在C++中实现类的可变更函数属性

要在C++中让类拥有可动态变更的函数属性,标准做法是使用**std::function**(来自<functional>头文件)来存储可调用对象,它支持存储lambda表达式、函数指针、绑定的成员函数等,灵活性很高。

你的代码错误原因分析

  1. 表达式不可赋值:你把func声明成了普通成员函数void func();,this->func()是函数调用操作,不是可赋值的变量。需要把func改成std::function<void()>类型的成员变量,才能存储可调用对象并赋值。
  2. this的非法使用:this指针只能在类的非静态成员函数内部使用,main函数是全局函数,里面的lambda无法直接用this指代Thing对象,需要通过捕获对象的引用/指针来访问其成员。

修正后的完整代码

#include <iostream>
#include <functional> // 必须包含此头文件以使用std::function

class Thing {
private:
    int val;
    std::function<void()> func; // 用std::function存储可调用对象

public:
    // 用初始化列表初始化成员,比构造函数内赋值更规范
    Thing(int val = 0) : val(val) {}

    // 设置函数,接收std::function类型参数,避免和成员变量重名,参数用f
    void setFunc(std::function<void()> f) {
        func = std::move(f); // 移动赋值提升效率
    }

    void useFunc() {
        if (func) { // 调用前检查函数是否已赋值,避免空调用崩溃
            func();
        }
    }

    // 提供getter让外部函数访问私有成员val(也可直接将val设为public,视需求而定)
    int getVal() const {
        return val;
    }
};

int main() {
    Thing thing1(1);

    // 捕获thing1的引用,在lambda中访问其成员
    thing1.setFunc([&thing1]() {
        std::cout << "i am thing 1, my value is: " << thing1.getVal() << std::endl;
    });

    thing1.useFunc();

    // 随时更换函数逻辑
    thing1.setFunc([&thing1]() {
        std::cout << "updated function: thing1's value doubled is " << thing1.getVal() * 2 << std::endl;
    });

    thing1.useFunc();

    return 0;
}

其他可选实现方式

  • 函数指针:如果只需要存储无捕获的普通函数或静态成员函数,可以用函数指针类型void (*func)()作为成员变量,但无法存储带捕获的lambda,灵活性远不如std::function。
  • 成员函数指针:如果要存储类的成员函数,可使用void (Thing::*func)()类型,调用时需用(this->*func)(),但只能存储当前类的成员函数,无法存储外部函数或lambda。

内容的提问来源于stack exchange,提问作者MWRazer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:53:30