C ++如何使函数指针指向类方法

j76*_*boy 3 c++ pointers function-pointers

我在制作指向类方法的函数指针时遇到麻烦。我做了一个指向非类方法的函数指针,它工作正常。

int foo(){
    return 5;
}

 int main()
{
    int (*pointer)() = foo;

    std::cout << pointer();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我试图将其应用为使类中的实例变量成为函数指针。

这是头文件。它声明了变量方法将指向的私有方法Print。

class Game
{

public:

    Game();

private:

    void Print();

    void (method)( void );

};
Run Code Online (Sandbox Code Playgroud)

Game构造函数尝试将指针方法分配给Print方法的地址。编译时,该行出现错误,提示“错误:必须调用对非静态成员函数的引用;”。我不知道那是什么意思 什么是实现此目的的正确方法?

Game::Game( void )
{

    method = &Game::Print;

}

void Game::Print(){
    std::cout << "PRINT";
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ker 5

成员函数与普通函数有很大的不同,因此当您要指向成员函数时,您需要的是指向成员函数的指针,而不仅仅是指向函数的指针。指向成员函数指针的语法包括成员函数所属的类:

void (Game::*mptr)();
Run Code Online (Sandbox Code Playgroud)

这定义了一个指向成员函数mptr的指针,该指针具有指向该类成员函数的指针,该成员函数Games不带参数也不返回任何内容。与普通函数指针对比:

void (*ptr)();
Run Code Online (Sandbox Code Playgroud)

这定义了一个指向函数ptr的指针,该指针持有指向不带任何参数且不返回任何内容的函数的指针。


sol*_*333 5

刚刚发现你可以做

#include <functional>
#include <cassert>

using namespace std;

struct Foo {
   int x;
   int foo() { return x; }
};

int main() {
  function<int(Foo&)> f = &Foo::foo;
  Foo foo = { 3 };
  assert(f(foo) == 3);
  foo.x = 5;
  assert(f(foo) == 5);
}
Run Code Online (Sandbox Code Playgroud)

std::mem_fn()也可能有效:https ://en.cppreference.com/w/cpp/utility/featured/mem_fn