我正在尝试将多个参数的函数传递给其他函数。我知道如何将单参数函数传递给其他函数,如C ++入门加本书中所述。
但是,当我尝试将带有class(poly_3d)的多个参数传递给NR_method函数时,出现错误。
#include <iostream>
#define log(x) std::cout<<x<<std::endl;
class constants {
public:
double A;
double B;
double C;
};
double poly_3d(double x, constants cst);
double NR_method(double a, double(*poly_3d)(double));
int main() {
constants cst;
cst.A = 2;
cst.B = -8;
cst.C = 10;
NR_method(3.2, poly_3d);
system("PAUSE");
return 0;
}
double poly_3d(double x, constants cst) {
double y = 3 * cst.A*x*x + 2 * cst.B*x + cst.C;
return y;
}
double NR_method(double a, double (*poly_3d)(double)) {
double c = (*poly_3d)(a);
return c;
}
所以我得到的错误是来自主函数中的NR_method(3.2,poly_3d)。我知道,如果poly_3d是单个arg,则可以使用。
如果这是编写代码的可怕方式,那么对于初学者更有效地学习C ++的任何指导将不胜感激!谢谢
答案 0 :(得分:0)
看看下面的代码。我们正在使用模板使外观看起来更好。
#include <iostream>
#define log(x) std::cout<<x<<std::endl;
class constants {
public:
double A;
double B;
double C;
};
/// Note that we take a ref now, no need to copy cst.
double poly_3d(double x, constants & cst)
{
double y = 3 * cst.A*x*x + 2 * cst.B*x + cst.C;
return y;
}
/// Note that we take a ref now, no need to copy cst.
template <class F>
double NR_method(double a, constants & cst, F func)
{
return func(a, cst);
}
int main() {
constants cst;
cst.A = 2;
cst.B = -8;
cst.C = 10;
NR_method(3.2, cst, &poly_3d);
system("PAUSE");
return 0;
}
答案 1 :(得分:0)
您要声明带有2个参数但仅传递一个参数的poly_3d函数。我为您修改了代码
#include <iostream>
#define log(x) std::cout<<x<<std::endl;
class constants {
public:
double A;
double B;
double C;
};
double poly_3d(double x, constants cst);
double NR_method(double a, constants cst, double(*poly_3d)(double, constants));
int main() {
constants cst;
cst.A = 2;
cst.B = -8;
cst.C = 10;
printf("%f", NR_method(3.2, cst, poly_3d));
system("PAUSE");
return 0;
}
double poly_3d(double x, constants cst) {
double y = 3 * cst.A*x*x + 2 * cst.B*x + cst.C;
return y;
}
double NR_method(double a, constants cst, double (*poly)(double, constants)) {
return (*poly)(a, cst);
}
答案 2 :(得分:0)
让我们从简化代码开始。 (minimal example消除了干扰,使您可以更好地关注实际问题。)您似乎已经开始这样做了,但是可以采取进一步的措施。在删除了一些不需要重新生成编译错误的内容之后:
class constants {};
double poly_3d(double x, constants cst);
double NR_method(double a, double(*poly_3d)(double));
int main() {
NR_method(3.2, poly_3d);
}
double poly_3d(double x, constants /*cst*/) {
return 3 * x;
}
double NR_method(double a, double (*poly_3d)(double)) {
return (*poly_3d)(a);
}
现在让我们看看错误消息:
错误:从“
double (*)(double, constants)
”到“double (*)(double)
”的无效转换
这表示从poly_3d
到NR_method
的第二个参数的转换。如果您查看这些内容,是的,这就是您要求的转换。 poly_3d
的参数列表为(double, constant)
,而第二个参数的声明参数列表仅为(double)
。不匹配,导致转换无效。与单参数情况没有什么不同:签名必须匹配。您可以通过将参数的签名更改为poly_3d
的数学签名来解决此问题。
现在,如果仅使签名匹配,则存在另一个问题,即NR_method
没有可用的constants
值。这可能是您要解决的逻辑错误。为了显示消除编译器错误的快速解决方法,我将添加一个局部变量。
class constants {
};
double poly_3d(double x, constants cst);
double NR_method(double a, double(*poly_3d)(double, constants)); // <-- Desired signature
int main() {
NR_method(3.2, poly_3d);
}
double poly_3d(double x, constants /*cst*/) {
return 3.0 * x;
}
double NR_method(double a, double (*poly_3d)(double, constants)) {
constants cst; // <-- Allows this to compile, but probably not what you want.
return (*poly_3d)(a, cst); // <-- Needed a second parameter here.
}
有多种方法可以使这项工作更好(例如,std::function
可能比函数指针更方便),但是解释这些问题将超出此问题的范围,尤其是因为某些决定取决于大局观。