C++ 将包含类的多个参数的函数传递给其他函数

C++ 将包含类的多个参数的函数传递给其他函数,c++,C++,我试图将多个参数的函数传递给另一个函数。我知道如何把一个函数的函数传递给其他函数,就像在C++入门书中所描述的那样。p> 然而,当我试图将多个类参数(poly_3d)传递给NR_方法函数时,我遇到了一个错误 #include <iostream> #define log(x) std::cout<<x<<std::endl; class constants { public: double A; double B; double

我试图将多个参数的函数传递给另一个函数。我知道如何把一个函数的函数传递给其他函数,就像在C++入门书中所描述的那样。p> 然而,当我试图将多个类参数(poly_3d)传递给NR_方法函数时,我遇到了一个错误

#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;
}
#包括

#定义log(x)std::cout查看以下代码。我们正在使用一个模板使事情看起来更好

#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;
}
#包括

#define log(x)std::cout您正在用两个参数声明函数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);
}
#包括

#定义log(x)std::cout让我们从简化代码开始。(A可以消除干扰,让你更好地关注实际问题。)看起来你已经开始这样做了,但还可以做得更远。删除一些复制编译错误不需要的内容后:

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,常量)
”到“
double(*)(double)
”的转换无效

这表明转换是从
poly_3d
NR_方法的第二个参数。如果你看这些东西,是的,那就是你要求的转换。
poly_3d
的参数列表是
(双精度,常量)
,而第二个参数的声明参数列表只是
(双精度)
。存在不匹配,这使得转换无效。它与单参数情况并没有什么不同:签名必须匹配。您可以通过将参数的签名更改为
poly_3d
的数学签名来解决此问题

现在,如果您只是使签名匹配,那么
NR_方法
没有可用的
常量
值,这是另一个问题。这可能是你要解决的一个逻辑错误。为了快速解决编译器错误的消除问题,我将添加一个局部变量

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.
}
类常量{
};
双多边形3d(双x,常数cst);

双NR_法(双a,双(*poly_3d)(双,常数));//您只是缺少声明中的第二个参数:
double(*poly_3d)(double,constants)
。全局
poly_3d
包含两个参数(一个
double
和一个
constants
实例)。
NR_方法
的第二个形式参数是指向返回
double
并接受一个参数(a
double
)的函数的指针。因此,
NR_方法(3.2,poly_3d)
格式不正确,无法编译。我几乎很好奇你到底想做什么,而不仅仅是问你想做的方式有什么问题。目前来看,
NR_方法的有用性是非常值得怀疑的,尤其是一旦它被“修复”了。谢谢!我没有意识到我需要添加常数cst。我想因为我在第一个函数中添加了,所以我不需要再添加它们。谢谢您的反馈。我还没有学会模板是什么,但我现在肯定会学习它。非常感谢。谢谢您的详细解释和反馈,先生。我真的很感激!!