C++ 将函数作为参数传递给作为类的公共成员的两个函数
我有一个公共成员函数,它需要作为参数传递给一个函数,该函数低于我需要从中启动计算的函数。此外,需要传递的函数还需要参数。我在C++中工作,这是我的第一个大型编码项目,并且我在诊断编译错误方面有困难。 请注意,我试图避免使用指针,这不是我的选择,而是(编辑)我的上司,因此所有内容都是参考的C++ 将函数作为参数传递给作为类的公共成员的两个函数,c++,functional-programming,C++,Functional Programming,我有一个公共成员函数,它需要作为参数传递给一个函数,该函数低于我需要从中启动计算的函数。此外,需要传递的函数还需要参数。我在C++中工作,这是我的第一个大型编码项目,并且我在诊断编译错误方面有困难。 请注意,我试图避免使用指针,这不是我的选择,而是(编辑)我的上司,因此所有内容都是参考的 ----------------------------------------------------------------- 一班{ 公众: 无效获取值(整数和整数、双倍和整数); 私人: 向量u2;;
-----------------------------------------------------------------
一班{
公众:
无效获取值(整数和整数、双倍和整数);
私人:
向量u2;;
} ;
void Class1::get_val(int&a,double&val){vector_[a]=val;}
-----------------------------------------------------------------
二级{
公众:
无效计算函数(内部和外部),
函数函数调用,
双人床(ans)
私人:
整数转换;
无效计算其他功能(内部和外部),
函数函数调用,
双人床(ans)
} ;
无效类别2::计算函数(内部和外部),
函数函数调用,
双人床(ans)
{
int c=b*2;
双tmp_val;
计算其他功能(c、功能调用、tmp值);
ans=tmp_val/4;
}
无效类别2::计算其他功能(内部和外部),
函数函数调用,
双人床(ans)
{
int d;
双val;
d=c/换算系数;
函数调用(d,val);
ans=val;
}
-----------------------------------------------------------------
int main()
{
int b=4;
双ans;
类2.计算函数(b,类1.获取值(int,double),ans);
}
-----------------------------------------------------------------
我得到的编译错误是:
在成员函数void Class2::calc_func(int&,double&)中:
错误:“int”之前应为主表达式
Case1.GETYVALL(int,double),“,首先,像Python一样,调用实例方法时需要实例化对象,而不是C++类中的类(<代码>静态< /代码>)。 在修复了代码中的一些语法问题后,我尝试使用
std::bind
,但它不起作用,因为它返回的类型与std::function
不兼容
所以,我认为剩下的唯一简单的方法就是使用lambda,例如:
int main()
{
int b = 4;
double ans;
Class1 c1;
Class2 c2;
c2.calc_func(b, [&c1](int i, double d) {c1.get_val(i, d);}, ans);
}
或者您可以传递非成员函数,也可以包装对成员函数的访问,即:
Class1 c1;
void get_c1_val(int i, double d)
{
c1.get_val(i, d);
}
int main()
{
int b = 4;
double ans;
Class2 c2;
c2.calc_func(b, get_c1_val, ans);
}
PS:理论上,您可以使用
std::mem\fn
而不是std::function
,并直接传递对get\u val
的引用,但看起来像这样的旧模板会随着时间的推移而被弃用,所以我不会使用它们…让Class2的一个实例调用成员函数calc\u func
。否则将calc_func声明为静态函数。顺便说一句:Class1::get_val()
具有参数int&,double&
,但functocall
需要签名int,double
。这是一个不同的例子。引用与Vals.首先,看起来C++中的java或类似的语言,当访问类函数<代码>::< /C> >代替<代码> > <代码>。第二,当传递函数时,不需要指定它的参数或参数类型。第三,您可能需要使用std::bind
将函数绑定到特定实例,当然,如果它不是静态的。如果您提供了最小的可复制示例(即,不要删除类声明),这将非常有用。@Scheff因此我尝试更改签名,但收到以下错误“错误:调用(std::function)(int&,const int&,double&')”@sklott我没有Java方面的经验,只有Python和Fortran90。我编辑了我的示例,以便根据您的要求添加更多详细信息。