【问题标题】:Clarification with accessing non-static class member function via pointer通过指针访问非静态类成员函数的说明
【发布时间】:2018-05-07 03:35:28
【问题描述】:

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

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

【问题讨论】:

    标签: c++ non-static


    【解决方案1】:

    您在引用 fn_ptr 时缺少 bar.,这是该对象的一个​​属性。改成:

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

    而且它有效。

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

    【讨论】:

      【解决方案2】:

      我相信正确的语法是:

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

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-02
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多