C++ 如何使函数指针指向 class 方法
C++ How to make function pointer to class method
我在创建指向 class 方法的函数指针时遇到问题。我创建了一个指向非 class 方法的函数指针,它工作正常。
int foo(){
return 5;
}
int main()
{
int (*pointer)() = foo;
std::cout << pointer();
return 0;
}
我试图将其应用于 class 中的实例变量成为函数指针。
这是头文件。它声明了变量方法将指向的私有方法 Print。
class Game
{
public:
Game();
private:
void Print();
void (method)( void );
};
Game 构造函数尝试将指针方法分配给 Print 方法的地址。编译后,该行出现错误 "error: reference to non-static member function must be called;"。我不知道那是什么意思。正确的实现方式是什么?
Game::Game( void )
{
method = &Game::Print;
}
void Game::Print(){
std::cout << "PRINT";
}
成员函数与普通函数有很大的不同,所以当你想指向一个成员函数时,你需要一个指向成员函数的指针,而不仅仅是一个指向函数的指针。指向成员函数的语法包括 class 成员函数是以下成员的:
void (Game::*mptr)();
这定义了一个名为 mptr
的指向成员函数的指针,它包含指向 class Games
的不带参数的成员函数的指针,并且 returns 没有什么。与普通函数指针对比:
void (*ptr)();
这定义了一个名为 ptr
的指向函数的指针,它包含一个指向不带参数且 returns 没有任何参数的函数的指针。
刚发现你可以做到
#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
1- 使用以下语法指向成员函数:
return_type (class_name::*ptr_name) (argument_type) = &class_name::function_name;
2- 记住要有一个指向成员函数的指针,你需要使它成为 public。
你的情况:
class Game
{
public:
Game(){}
void print() {
//todo ...
}
};
// Declaration and assignment
void (Game::*method_ptr) () = &Game::print;
我在创建指向 class 方法的函数指针时遇到问题。我创建了一个指向非 class 方法的函数指针,它工作正常。
int foo(){
return 5;
}
int main()
{
int (*pointer)() = foo;
std::cout << pointer();
return 0;
}
我试图将其应用于 class 中的实例变量成为函数指针。
这是头文件。它声明了变量方法将指向的私有方法 Print。
class Game
{
public:
Game();
private:
void Print();
void (method)( void );
};
Game 构造函数尝试将指针方法分配给 Print 方法的地址。编译后,该行出现错误 "error: reference to non-static member function must be called;"。我不知道那是什么意思。正确的实现方式是什么?
Game::Game( void )
{
method = &Game::Print;
}
void Game::Print(){
std::cout << "PRINT";
}
成员函数与普通函数有很大的不同,所以当你想指向一个成员函数时,你需要一个指向成员函数的指针,而不仅仅是一个指向函数的指针。指向成员函数的语法包括 class 成员函数是以下成员的:
void (Game::*mptr)();
这定义了一个名为 mptr
的指向成员函数的指针,它包含指向 class Games
的不带参数的成员函数的指针,并且 returns 没有什么。与普通函数指针对比:
void (*ptr)();
这定义了一个名为 ptr
的指向函数的指针,它包含一个指向不带参数且 returns 没有任何参数的函数的指针。
刚发现你可以做到
#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
1- 使用以下语法指向成员函数:
return_type (class_name::*ptr_name) (argument_type) = &class_name::function_name;
2- 记住要有一个指向成员函数的指针,你需要使它成为 public。
你的情况:
class Game
{
public:
Game(){}
void print() {
//todo ...
}
};
// Declaration and assignment
void (Game::*method_ptr) () = &Game::print;