成员函数的函数指针

Jac*_*cob 2 c++ member-function-pointers class

有几个副本,但没有人解释为什么我可以使用成员变量来存储指针(in FOO)但是当我尝试使用局部变量(在注释部分BAR)时,它是非法的.有人可以解释一下吗?

#include <iostream>
using namespace std;

class FOO
{
public:
 int (FOO::*fptr)(int a, int b);
 int add_stuff(int a, int b)
 {
  return a+b;
 }
 void call_adder(int a, int b)
 {  
  fptr = &FOO::add_stuff;
  cout<<(this->*fptr)(a,b)<<endl;
 }
};

class BAR
{
public:
 int add_stuff(int a, int b)
 {
  return a+b;
 }
 void call_adder(int a, int b)
 {  
  //int (BAR::*fptr)(int a, int b);
  //fptr = &BAR::add_stuff;
  //cout<<(*fptr)(a,b)<<endl;
 }
};

int main()
{
 FOO test;
 test.call_adder(10,20);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 8

显然,你误解this->*了电话中的含义FOO.

当您使用this->*成员fptr指针时,该this->*部分与fptr成为其成员完全无关FOO.使用指向成员的指针调用成员函数时,必须使用->*运算符(或.*运算符),并且始终必须指定要与指针成员一起使用的实际对象.这就是this->*调用表达式的部分所做的.即电话总是看起来像

(<pointer-to-object> ->* <pointer-to-member>) (<arguments>)
Run Code Online (Sandbox Code Playgroud)

或者作为

(<object> .* <pointer-to-member>) (<arguments>)
Run Code Online (Sandbox Code Playgroud)

呼叫的左侧(<pointer-to-object><object>上方)不能省略.

换句话说,这不要紧,无论fptr是一个成员变量,局部变量,全局变量或任何其他类型的变量,呼叫通过fptr始终看起来

(this->*fptr)(a, b);
Run Code Online (Sandbox Code Playgroud)

假设您要使用*thisobject 调用它.另一个例子是,如果要为指针指向的其他对象调用它pfoo,则调用将如下所示

FOO *pfoo;
...
(pfoo->*fptr)(a, b);
Run Code Online (Sandbox Code Playgroud)

在您的BAR类中,(this->*fptr)(a,b)即使fptr是局部变量,调用也应该看起来像.


Bil*_*eal 7

使用成员函数指针时,需要指定它所作用的对象.

即你需要创建一个指向BAR实例的指针(让它调用它bar)并执行:

(bar->*fptr)(a,b)
Run Code Online (Sandbox Code Playgroud)

调用函数或BAR的实例并执行:

(bar.*fptr)(a,b)
Run Code Online (Sandbox Code Playgroud)

换一种方式:

#include <iostream>

class BAR
{
    int i;
public:
    BAR(): i(0) {};
    int AddOne() { return ++i; };
    int GetI() { return i; };
}

int main()
{
    BAR bar;
    auto fPtr = &BAR::AddOne; // This line is C++0x only (because of auto)
    std::cout << (bar.*fPtr)(); //This will print 1 to the console
    std::cout << std::endl;
    std::cout << bar.GetI(); //This will also print 1 to the console.
}
Run Code Online (Sandbox Code Playgroud)

  • 这是他需要创建的BAR的一个实例,而不是FOO. (2认同)