在赋值pt2function =& B :: generate_callback;

时间:2016-11-08 05:31:56

标签: c++ class oop callback function-pointers

我是c ++的新手。我正在尝试创建一个包含2个类的pgm,其中一个类有一个成员函数,它会通过函数指针在另一个类中生成一个回调函数,但我一直在跟随错误。

#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);
           ^
           ^

2 个答案:

答案 0 :(得分:0)

变量pt2function是指向 非成员 功能的指针。这样的指针与指向成员函数的指针不兼容。编译器告诉您的第一个错误是:int (*)(string)int (B::*)(string)不兼容。

您需要将pt2function定义为指向B成员函数的指针:

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

现在,您可以将B的匹配成员函数初始化或指定给变量pt2function

这也解决了第二个错误,它基本上表示在当前代码中变量pt2function不是指向成员函数的指针,因此不能这样使用。

答案 1 :(得分:0)

指向函数的指针和指向成员函数的指针实际上是不同的野兽。

您主要有两个选项可以让它在您的代码中运行:

  • 更改此行:

    int (*pt2function)(string)=NULL;
    

    对此:

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

    这是将pt2function定义为指向B的成员函数的指针,该函数获得string并返回int

  • generate_callback声明为静态方法,并在pt2function(str);函数中将其作为main调用。
    实际上,可以将静态成员函数分配给指向函数的指针,就像您已使用的函数一样。