通过指针访问非静态 class 成员函数的说明

Clarification with accessing non-static class member function via pointer

我在从函数指针访问非静态成员函数时遇到困难,无法完全弄清楚我的语法问题。当尝试如下所示进行编译时,我收到 "error: fnc_ptr not declared in this scope." 并且当代码被修改为不访问该函数时,它应该指向它编译并为 bar.fn_ptr 打印出 1 。为了编译我使用了:

g++ -std=c++11 -Wall example.cpp foo.cpp

拆分文件 structure/namespace 只是为了模拟与我的原始问题相同的条件。

example.cpp

#include "foo.h"
#include <iostream>

int main(int argc, char* argv[]){

  pizza::foo bar;
  bar.fn_ptr = &pizza::foo::fnc_one;
  std::cout << (bar.*fn_ptr)(1) << std::endl;

  return 0;
}

foo.cpp

#include <cmath>
#include "foo.h"

namespace pizza{

   double foo::fnc_one(double x){
        return pow(x,3) - x + 2;
   }
}

foo.h

namespace pizza{

   class foo{
       public:
        double (foo::*fn_ptr)(double);
        double fnc_one(double);

        foo(){
           fn_ptr = 0;
        }
   };
}

可以找到一个非常相似的问题 here, with additional reference here

您在引用作为该对象属性的 fn_ptr 时缺少 bar.。将其更改为:

  std::cout << (bar.*(bar.fn_ptr))(1) << std::endl;

而且有效。

我还建议阅读有关该主题的常见问题解答:https://isocpp.org/wiki/faq/pointers-to-members

我认为正确的语法是:

//std::cout << (bar.*fn_ptr)(1) << std::endl;
std::cout << (bar.*(bar.fn_ptr))(1) << std::endl;