C++:如何在Function类构造函数中绑定传入的外部函数为私有函数?
搞定你的Function类:用函数指针存储外部函数
嘿,我明白你的需求啦!你现在遇到的核心问题是:类里的私有成员function是一个普通的成员函数,而不是函数指针,所以没法直接把外部传入的函数赋值给它。咱们只需要调整一下类的成员类型,就能轻松解决这个问题。
第一步:把私有成员改成函数指针类型
把原来的float function(float x);替换成函数指针的声明,这样它就能存储指向外部函数的指针了:
float (*function)(float); // 这是一个指向"接收float参数、返回float的函数"的指针
第二步:在构造函数里赋值函数指针
你的构造函数参数已经是函数指针类型啦(C++会自动把float method(float)这种形式转换成函数指针),所以直接赋值就行。当然,你也可以把参数写成更明确的函数指针形式,可读性更好:
// 写法1:用隐式转换的参数形式 Function(float method(float)) { function = method; } // 写法2:明确的函数指针参数(更清晰) Function(float (*method)(float)) { function = method; }
或者用初始化列表的方式,更符合C++的最佳实践:
Function(float (*method)(float)) : function(method) {}
修正后的完整代码
我还顺便帮你修正了代码里的两个小bug:导数计算的符号(原来的结果是负的导数),以及积分循环的起始值(原来从0开始,应该从传入的x0开始):
#include <iostream> #include <math.h> class Function { // 改为函数指针类型 float (*function)(float); public: // 用初始化列表赋值函数指针 Function(float (*method)(float)) : function(method) {} float eval(float x) { return function(x); } float derive(float x, float error = 0.001) { // 修正:导数的正确计算方式是 (f(x+error) - f(x))/error return (function(x + error) - function(x)) / error; } float integrate(float x0, float x1, float partitions = 100) { float integral = 0; float step = (x1 - x0) / partitions; // 修正:从x0开始遍历,而不是0 for(float i = x0; i < x1; i += step) { integral += step * function(i); } return integral; } }; float exampleFunction(float x) { return 2 * pow(x, 2) + 5; } int main() { Function myFunction(exampleFunction); std::cout << "eval(6): " << myFunction.eval(6) << std::endl; // 输出77 std::cout << "derive(6): " << myFunction.derive(6) << std::endl; // 近似24 std::cout << "integrate(0,6): " << myFunction.integrate(0,6) << std::endl; // 近似174 return 0; }
进阶:用std::function让代码更灵活
如果你用的是C++11或更高版本,推荐用std::function替代原始函数指针,它支持更多场景,比如lambda表达式、绑定类成员函数等等:
#include <iostream> #include <math.h> #include <functional> // 要包含这个头文件 class Function { std::function<float(float)> function; public: Function(std::function<float(float)> func) : function(func) {} // 其他成员函数和之前一样 float eval(float x) { return function(x); } // ... }; // 甚至可以直接传入lambda表达式 int main() { Function myLambdaFunc([](float x) { return 3*x + 2; }); std::cout << myLambdaFunc.eval(5) << std::endl; // 输出17 return 0; }
这样你的类就更强大啦!
内容的提问来源于stack exchange,提问作者Benjamin Brownlee
相关产品推荐
相关产品推荐

