2016-11-08 7 views
0

Я новичок в C++. Я пытаюсь создать pgm, который содержит 2 класса, из которых один класс имеет функцию-член, которая будет генерировать функцию обратного вызова в другом классе, хотя указатель функции, но я продолжаю получать следующие ошибка.не может преобразовать 'int (B :: *) (std :: string)' to 'int (*) (std :: string)' в присваивании pt2function = & B :: generate_callback;

#include <iostream> 
    #include <string> 

    using namespace std; 



    class B 
    { 
    private: std::string str1; 
    public: int generate_callback(std::string str1); 


    }; 
    int B::generate_callback(std::string str1) 
    { 
     if ((str1=="Generate")||(str1=="generate")) 
     { 
      Cout<<"Callback generated "; 
     } 
    return 0; 
    } 

    class A : public B 
    { 
    public: 
       void count(int a,int b); 
     private: int a,b; 

    }; 


    void A::count(int a, int b) 
    { 
     for (a=1;a<b;a++){ 
      if(a==50) 
      { 
       cout<<"Generating callback "; 

       goto exit; 

     } 
    exit: ; 
    } 
    } 

    int (*pt2function)(string)=NULL; 
    int main() 
    { 
     B obj1; 
     A obj2; 
     string str; 
     cout<<"To generate callback at int i=50 please enter 'generate'"; 
     cin>>str; 
     obj2.count(1,100); 
     pt2function=&B::generate_callback; 
     (obj1.*pt2function)(str); 
     return 0; 
    } 

Ошибки:

main.cpp:57: error: cannot convert 'int (B::*)(std::string) {aka int (B::*)(std::basic_string<char>)}' to 'int (*)(std::string) {aka int (*)(std::basic_string<char>)}' in assignment 
    pt2function=&B::generate_callback; 

/home/adt/practice/N_practise/n_pract_2/pract2/main.cpp:58: error: 'pt2function' cannot be used as a member pointer, since it is of type 'int (*)(std::string) {aka int (*)(std::basic_string<char>)}' 
    (obj1.*pt2function)(str); 
     ^
     ^
+0

Указатель на функцию-член не совпадает с указателем на функцию, не являющуюся членом, а 'pt2function' является указателем на функцию, не являющуюся членом. Я предлагаю вам заглянуть в ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function) и [' std :: bind'] (http: // ru. cppreference.com/w/cpp/utility/functional/bind). –

+0

@Someprogrammerdude какие исправления я иду вперед, если я должен использовать указатели функций? – TheNVP

+0

Вам нужно сделать 'pt2function' указателем на функцию' B'. Синтаксис в основном показан в сообщении об ошибке. –

ответ

0

Переменная pt2function представляет собой указатель на , не являющегося членом функции. Такой указатель несовместим с указателем на функцию-член. Это то, что компилятор сообщает вам с первой ошибкой: A int (*)(string) несовместим с int (B::*)(string).

Вам нужно определить pt2function как указатель на функцию в B члена:

int (B::*pt2function)(string)=NULL; 

Теперь вы можете инициализировать или назначить соответствующую функцию-член B переменной pt2function.

Это также устраняет ошибки, которые в основном говорят, что в вашем текущем коде переменная pt2function не является указателем на функцию-член и поэтому не может использоваться как таковая.

0

Указатели на функции и указатели на функции-члены - действительно разные звери.

У вас есть в основном два варианта, чтобы заставить его работать в вашем коде:

  • Измените эту строку:

    int (*pt2function)(string)=NULL; 
    

    Для этого:

    int (B::*pt2function)(string)=NULL; 
    

    Это является определяющим pt2function, как указатель на функцию-член B, которая получает string и возвращает int.

  • Объявление generate_callback как статический метод и вызывать его как pt2function(str); в вашей функции main.
    На самом деле, статическая функция-член может быть назначена указателю на функцию, подобную той, которую вы уже используете.

 Смежные вопросы

  • Нет связанных вопросов^_^