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

Mat*_*tia 7 c++ function-pointers non-static

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

这是"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);
};
Run Code Online (Sandbox Code Playgroud)

这是"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);
}
Run Code Online (Sandbox Code Playgroud)

最后这是主要的"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;
}
Run Code Online (Sandbox Code Playgroud)

当我调用"result = aaa(Fun1,X0);"时,错误发生在Funcs :: solver方法中.因为我不能使用指向Fun1的指针,因为它是一个非静态成员.同时我不能使它静止,否则在静态方法中看不到变量"a".

在此先感谢您的帮助.

Vas*_*kin 6

问题是您正在尝试将指针传递给成员函数,而指向非成员函数或静态成员函数的指针是预期的.那些是不同的类型.

这里"有趣"是指向功能的指针: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);
}
Run Code Online (Sandbox Code Playgroud)

查看Coliru的实例.

如果你想故意限制你的方法aaa只接受Funcs成员函数,这可能是一个很好的方法fun.如果您还想将非成员函数或lambdas传递给aaa,请考虑使用std::function.