gpt4 book ai didi

c++ 指向非静态成员函数的指针

转载 作者:可可西里 更新时间:2023-11-01 18:25:00 25 4
gpt4 key购买 nike

我已经阅读了很多关于指向非静态成员函数的指针的帖子和答案,但看起来没有一个能够解决我的问题。
所以我创建了一个简短的例子来复制我的问题:即使这个例子可以用不同的方式“解决”,对于最终的软件来说,保持例子中的结构很重要,谢谢。

这是“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);
}

查看实例 at Coliru .

如果您想有意限制您的方法 aaa 仅接受 Funcs 成员函数作为 fun,这可能是一个很好的方法。如果您还想传递非成员函数或例如lambda 到 aaa,请考虑使用 std::function

关于c++ 指向非静态成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com