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

时间:2019-07-05 20:39:20

标签: c++

我正在尝试将多个参数的函数传递给其他函数。我知道如何将单参数函数传递给其他函数,如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 ++的任何指导将不胜感激!谢谢

3 个答案:

答案 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_3dNR_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可能比函数指针更方便),但是解释这些问题将超出此问题的范围,尤其是因为某些决定取决于大局观。