Using a member function pointer within a class

前端 未结 5 584
有刺的猬
有刺的猬 2020-12-28 21:21

Given an example class:

class Fred
{
public:
Fred() 
{
    func = &Fred::fa;
}

void run()
{
     int foo, bar;
     *func(foo,bar);
}

double fa(int x,          


        
相关标签:
5条回答
  • 2020-12-28 21:53

    You need the following funky syntax to call member functions through a pointer:

    (this->*func)(foo, bar);
    
    0 讨论(0)
  • 2020-12-28 21:59

    The syntax you need looks like:

    ((object).*(ptrToMember)) 
    

    So your call would be:

    ((*this).*(func))(foo, bar);
    

    I believe an alternate syntax would be:

    (this->*func)(foo, bar);
    
    0 讨论(0)
  • 2020-12-28 22:05

    There are two things you need to take care of. First is the declaration of the function pointer type:

    private:
      typedef double (Fred::*fptr)(int x, int y);
      fptr func;
    

    Next is the syntax for calling the function using a pointer:

    (this->*func)(foo,bar)
    

    Here is the modified sample code that will compile and run:

    #include <iostream>
    
    class Fred
    {
    public:
      Fred() 
      {
        func = &Fred::fa;
      }
    
      void run()
      {
        int foo = 10, bar = 20;
        std::cout << (this->*func)(foo,bar) << '\n';
      }
    
      double fa(int x, int y)
      {
        return (double)(x + y);
      }
      double fb(int x, int y)
      {
      }
    
    private:
      typedef double (Fred::*fptr)(int x, int y);
      fptr func;
    };
    
    int
    main ()
    {
      Fred f;
      f.run();
      return 0;
    }
    
    0 讨论(0)
  • 2020-12-28 22:09

    A member function with two args is really a three arg function. 'this' is an implicit argument so the error you are getting is about missing the 'this' arg.

    0 讨论(0)
  • 2020-12-28 22:09

    Non static class member functions have hidden this pointer as an argument.

    I think, the syntax (this->*func)(foo,bar) is the way to make compiler understand that it need to add this to the function.

    0 讨论(0)
提交回复
热议问题