【问题标题】:Using a member function pointer within a class在类中使用成员函数指针
【发布时间】:2010-05-25 01:02:03
【问题描述】:

给定一个示例类:

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

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

double fa(int x, int y);
double fb(int x, int y);

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

我在通过指针“*func(foo,bar)”调用成员函数的行中遇到编译器错误,说:“term 不计算为采用 2 个参数的函数”。我做错了什么?

【问题讨论】:

    标签: c++ pointer-to-member


    【解决方案1】:

    您需要的语法如下:

    ((object).*(ptrToMember)) 
    

    所以你的电话是:

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

    我相信另一种语法是:

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

    【讨论】:

      【解决方案2】:

      您需要以下时髦的语法来通过指针调用成员函数:

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

      【讨论】:

        【解决方案3】:

        您需要注意两件事。首先是函数指针类型的声明:

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

        接下来是使用指针调用函数的语法:

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

        这是修改后的示例代码,将编译和运行:

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

        【讨论】:

          【解决方案4】:

          具有两个 args 的成员函数实际上是一个三个 arg 函数。 'this' 是一个隐式参数,因此您得到的错误是关于缺少 'this' 参数。

          【讨论】:

            【解决方案5】:

            非静态类成员函数已将此指针作为参数隐藏。

            我认为,语法 (this->*func)(foo,bar) 是让编译器明白它需要将它添加到函数中的方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-27
              • 2013-06-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多