C++中为类设置可变更函数属性的实现方法
在C++中实现类的可变更函数属性
要在C++中让类拥有可动态变更的函数属性,标准做法是使用**std::function**(来自<functional>头文件)来存储可调用对象,它支持存储lambda表达式、函数指针、绑定的成员函数等,灵活性很高。
你的代码错误原因分析
- 表达式不可赋值:你把
func声明成了普通成员函数void func();,this->func()是函数调用操作,不是可赋值的变量。需要把func改成std::function<void()>类型的成员变量,才能存储可调用对象并赋值。 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
相关产品推荐
相关产品推荐

