Указатель на функцию Ошибка при компиляции - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь изучить концепцию указателя на функцию. Я написал код, который выбрасывает ошибки, которые я не мог расшифровать. Пожалуйста, посмотрите

     # include<iostream>
     # include<stdio.h>
     # include<conio.h>

     using namespace std;
     typedef int(*pt2Func)(int,int);

     class A
     {
           private : int x;
                     int y;
           public:
                  A(){}
                  A(int a, int b)
                  {
                   x=a;
                   y=b;
                  } 
                  int sum(int a, int b){return a+b;}
                  int sub( int a , int b){return a-b;}
                  int mult( int a, int b){return a*b;}
                  pt2Func GetPtr2(const char c)
                  {
                      if (c == '+')
                      return &sum;    // line 25
                      else if(c== '-')
                      return &sub;    // line 27
                      else if(c=='*')
                      return &mult;   //line 29
                  }
                  void pass_ptr(int (*pointer_fn)(int,int))
                  {
                   int result;
                   result=(*pointer_fn)(10,5);
                   cout << " result is : " << result;
                  }
                   ~A(){}
     };

     int main()
     {
        A a(0,5); 
        pt2Func=(a.GetPtr2)('+');          //line 43
        int result = (a.*pt2Func)(5,10);   //line 44
        cout << "result is " << result;
        getch();
        return 0;  
     }

При компиляции этой программы я получаю следующие ошибки в строке 25,27,29:

cannot convert `int (A::*)(int, int)' to `int (*)(int, int)' in return 

Я также получаю сообщение об ошибке в строках 43 и 44, которые

expected primary-expression before='token'

Ответы [ 4 ]

3 голосов
/ 19 февраля 2012

Указатель на функции отличается от Указатель на (нестатический) Член Функции .

Есть несколько способов исправить вашу программу, я обрисую их в общих чертах:

  • Использовать свободные функции или статические вместо функций-членов
  • Изменить тип на указатель на член ((A::*)(int, int))
  • Использование std::function / std::bind
2 голосов
/ 19 февраля 2012

Вам нужно заменить typedef int(*pt2Func)(int,int); на:

 class A;                                 // <-- forward declaration
 typedef int (A::*pt2Func)(int,int);

Затем вам нужно заменить return &sum; на return &A::sum;, чтобы он соответствовал определенному вами типу.

Ивам также нужно заменить эти строки:

pt2Func=(a.GetPtr2)('+');         // <-- pt2Func is type, name of variable is missing
int result = (a.*pt2Func)(5,10);  // <-- type name (pt2Func) is not allowed here

на эти:

pt2Func ptr = a.GetPtr2('+');
int result = (a.*ptr)(5, 10);

Тогда все будет работать так, как было задумано;)

1 голос
/ 19 февраля 2012

Функция sum() является нестатической функцией-членом, и ее тип не int (*)(int,int).Это тип int (A::*)(int,int), как показано в сообщении об ошибке компилятора.То же самое относится и к двум другим функциям: sub и mult.

. Есть два решения.Простое решение - сделать эти функции static функцией-членом, тогда все в вашей программе будет работать без особых изменений, кроме следующих:

//pt2Func=(a.GetPtr2)('+'); //line 43 - error
pt2Func=a.GetPtr2('+');     //line 43 - corrected

//int result = (a.*pt2Func)(5,10); //line 44 - error
int result = pt2Func(5,10);        //line 44 - corrected
1 голос
/ 19 февраля 2012

Указатели на функцию-член - это не то же самое, что указатели на функцию. Я предлагаю прочитать раздел часто задаваемых вопросов C ++, посвященный этой теме: [33] Указатели на функции-члены .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...