我读过很多关于非静态成员函数指针的帖子和答案,但看起来没有一个能够解决我的问题。
因此,我创建了一个简短的示例来复制我的问题:即使这个示例可以以不同的方式“解决”,对于最终的软件来说,保持示例中的结构很重要,谢谢。
这是“Funcs.h”类的标头:
class Funcs
{
private:
double a = 1, b = 2;
public:
Funcs();
~Funcs();
double Fun1(double X);
double solver(double X0);
double aaa(double(*fun)(double), double x0);
};
这是“Funcs.cpp”类的 cpp:
#include "Funcs.h"
using namespace std;
Funcs::Funcs()
{
}
Funcs::~Funcs()
{
}
double Funcs::Fun1(double X) {
double f1 = a*X;
return f1;
}
double Funcs::solver(double X0)
{
double result;
result = aaa(Fun1, X0);
return result;
}
double Funcs::aaa(double(*fun)(double), double x0)
{
return fun(x0);
}
最后这是主要的“main.cpp”:
#include <iostream>
#include "Funcs.h"
using namespace std;
int main() {
double x0=1;
double result;
Funcs funcs;
result = funcs.solver(x0);
cout << result << endl;
return 0;
}
当我调用“result = aaa(Fun1, X0);”时,错误出现在方法 Funcs::solver 中。因为我不能使用指向 Fun1 的指针,因为它是非静态成员。同时我不能将其设为静态,否则在静态方法内部看不到变量“a”。
在此先感谢您的帮助。
问题是您试图传递一个指向成员函数的指针,而需要一个指向非成员函数或静态成员函数的指针。这些是不同的类型。
这里的“fun”是一个指向函数的指针:double(*fun)(double)
.
这是一个指向 Funcs 类成员函数的指针:double(Funcs::*fun)(double)
因此,您可以按照以下方法修改代码以使其正常工作。
class Funcs
{
// all the rest is the same
double aaa(double(Funcs::*fun)(double), double x0);
};
double Funcs::solver(double X0)
{
// ...
result = aaa(&Funcs::Fun1, X0);
// ...
}
double Funcs::aaa(double(Funcs::*fun)(double), double x0)
{
return (this->*fun)(x0);
}
查看实例在科利鲁 http://coliru.stacked-crooked.com/a/4fb8b487f046ce49.
如果您想故意限制您的方法,这可能是一个好方法aaa
只接受Funcs
成员函数为fun
。如果您还想传递非成员函数或例如lambda 表达式为aaa
,考虑使用std::function
反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)