通过指针

时间:2018-05-07 03:35:28

标签: c++ non-static

我无法从函数指针访问非静态成员函数,并且无法弄清楚我的语法问题。当尝试编译时如下所示,我收到"错误:fnc_ptr未在此范围内声明。"如果代码被修改为不访问该函数,它应该指向它编译并将打印出1为bar.fn_ptr。编译我用过:

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

拆分文件结构/命名空间只是为了模仿与原始问题相同的条件。

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,附加参考here

2 个答案:

答案 0 :(得分:3)

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

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

它有效。

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

答案 1 :(得分:0)

我相信正确的语法是:

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