我是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);
^
^
答案 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
调用。
实际上,可以将静态成员函数分配给指向函数的指针,就像您已使用的函数一样。