我正在尝试在类的构造函数上设置函数指针。
我收到以下错误:
错误1错误C2276:'&' :对绑定成员函数表达式的非法操作
任何人都可以告诉为什么会发生这种情况(下面的代码)?
编辑:
这个问题的例子更能说明我的情况。我只能改变MyClass。我无法触摸MyBase或它的内容。
class MyBase
{
public:
void (*MyFunctionPointer)(int args);
};
class MyClass : public MyBase
{
public:
void MyFunction(int args)
{
}
MyClass()
{
MyFunctionPointer = &MyFunction;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MyClass temp;
return 0;
}
class MyBase
{
public:
void (*MyFunctionPointer)(int args);
};
class MyClass : public MyBase
{
public:
void MyFunction(int args)
{
}
MyClass()
{
MyFunctionPointer = &MyFunction;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MyClass temp;
return 0;
}
答案 0 :(得分:1)
MyFunction
是成员函数,但MyFunctionPointer
是基本函数指针。
您应该调查生成a pointer-to-member-function的语法。
答案 1 :(得分:1)
指向方法函数的指针与指向全局函数和静态方法的指针的类型不同。
class MyClass;
class MyBase
{
public:
void (MyClass::* MyFunctionPointer)(int);
};
class MyClass : public MyBase
{
public:
void MyFunction(int args)
{
}
MyClass()
{
MyFunctionPointer = &MyClass::MyFunction;
}
};
int main(int argc, char* argv[])
{
MyClass temp;
return 0;
}
如果您无法更改MyBase
,则无法使用成员MyFunctionPointer
,因为它是指向全局函数或静态方法的类型指针。如果你告诉我们你想要达到的目的是什么,也许我们可以帮助你。
编辑2(操作编辑):
我要做的是编写一些可以提供此功能的代码。即,一个带有函数指针的基类,可以设置为非成员函数(temp1)...或者从包含可以被调用的非静态成员的类继承(temp2)。
class MyBase
{
public:
void (*MyFunctionPointer)(int args);
};
class MyClass : public MyBase
{
public:
void MyFunction(int args)
{
}
void Bind(void (*myFunctionPointer)(int args))
{
MyFunctionPointer = myFunctionPointer;
}
};
void MyFunction2(int args)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
MyBase temp1;
temp1.MyFunctionPointer = &MyFunction2; // <<-- ok
temp1.MyFunctionPointer(0);
MyClass temp2;
temp2.Bind(&temp2.MyFunction); // <<-- compile error
temp2.MyFunctionPointer(0);
return 0;
}
class MyBase
{
public:
void (*MyFunctionPointer)(int args);
};
class MyClass : public MyBase
{
public:
void MyFunction(int args)
{
}
void Bind(void (*myFunctionPointer)(int args))
{
MyFunctionPointer = myFunctionPointer;
}
};
void MyFunction2(int args)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
MyBase temp1;
temp1.MyFunctionPointer = &MyFunction2; // <<-- ok
temp1.MyFunctionPointer(0);
MyClass temp2;
temp2.Bind(&temp2.MyFunction); // <<-- compile error
temp2.MyFunctionPointer(0);
return 0;
}
编辑:
如前所述,指向函数的指针和指向方法的指针是不同的类型。那是一个指向函数的指针,不能分配方法地址和指向方法的指针不能分配函数地址。你可以有两个指针,一个指向函数的类型指针,另一个指向方法的指针和一个布尔值,它告诉你你使用哪两个指针。或者你可以使用模板。