Уточнение при доступе к нестатической функции-члену класса через указатель - PullRequest
0 голосов
/ 07 мая 2018

У меня проблемы с доступом к нестатической функции-члену из указателя на функцию, и я не могу понять мою проблему с синтаксисом. При попытке компиляции, как показано ниже, я получаю сообщение «ошибка: 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;
        }
   };
}

Очень похожий вопрос можно найти здесь , с дополнительной ссылкой здесь .

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я считаю, что правильный синтаксис:

//std::cout << (bar.*fn_ptr)(1) << std::endl;
std::cout << (bar.*(bar.fn_ptr))(1) << std::endl;
0 голосов
/ 07 мая 2018

Вы пропускаете bar., когда ссылаетесь на fn_ptr, который является атрибутом этого объекта. Измените его на:

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

И это работает.

Я также рекомендую прочитать этот FAQ по теме: https://isocpp.org/wiki/faq/pointers-to-members

...