【问题标题】:C++ How to make function pointer to class methodC ++如何使函数指针指向类方法
【发布时间】:2016-05-01 17:12:28
【问题描述】:

我无法将函数指针指向类方法。我做了一个指向非类方法的函数指针,它工作正常。

int foo(){
    return 5;
}

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

    std::cout << pointer();

    return 0;
}

我试图应用它来让类中的实例变量成为函数指针。

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

class Game
{

public:

    Game();

private:

    void Print();

    void (method)( void );

};

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

Game::Game( void )
{

    method = &Game::Print;

}

void Game::Print(){
    std::cout << "PRINT";
}

【问题讨论】:

  • 如果你想使用Game类的成员函数,它什么都不返回也没有参数,你需要void (Game::*method)();

标签: c++ pointers function-pointers


【解决方案1】:

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

void (Game::*mptr)();

这定义了一个名为mptr 的指向成员函数的指针,它包含一个指向Games 类成员函数的指针,该函数不接受任何参数并且不返回任何内容。与普通函数指针对比:

void (*ptr)();

这定义了一个名为 ptr 的指向函数的指针,它包含一个指向不带参数且不返回任何内容的函数的指针。

【讨论】:

  • 那行得通。我能找到调用方法的唯一方法是(this-&gt;*method)(); 有更好的调用方法吗?我也看不出这和(*method)(); 有什么区别
  • 不同之处在于必须在对象上调用(非静态)成员函数。这就是this-&gt;* 所做的。
【解决方案2】:

刚刚发现你可以做到

#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);
}

std::mem_fn() 也可以工作:https://en.cppreference.com/w/cpp/utility/functional/mem_fn

【讨论】:

    【解决方案3】:

    1- 使用以下语法指向成员函数:

    return_type (class_name::*ptr_name) (argument_type) = &class_name::function_name;
    

    2- 请记住有一个指向您需要公开的成员函数的指针。

    在你的情况下:

    class Game
    {
    
    public:
    
        Game(){}
    
        void print() { 
          //todo ...
        }
    
    
    };
    // Declaration and assignment
    void (Game::*method_ptr) () = &Game::print;
    

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多