我一直在尝试创建一个指向一个方法的指针函数(Visual C ++):
struct test
{
int tst(int a)
{
return a * 4;
}
};
// ok, this the visual C++ compiler does not accept it... (mingw accept it)
int(*tstptr)(int) = (int(*)(int))&test::tst;
然后我做了类似的事情:
struct Dx
{
int SomeMethod()
{
return 4;
}
};
struct Dy
{
static int(*pSomeMethod)();
};
int(Dy::*pSomeMethod)() = (int( Dy::*)())&Dx::SomeMethod;
到目前为止一切顺利,编译没有问题,但如果我试着打电话给她:
Dy::pSomeMethod();
编译器返回我:
错误1错误LNK2001:外部符号“public:static int(__stdcall * Dy :: pSomeMethod)(无效)“(?PSomeMethod @ Dy @@ 2P6GHXZA)尚未解决
我不明白,因为它没有假设pSomeMethod
他没有指向SomeMethod
?
答案 0 :(得分:1)
JLabel
的类型为&test::tst
,是成员函数指针。
您正尝试将其转换为常规指针类型,这是不可能的,因为它们完全不同。
这就是为什么你会有这个类型转换错误:
int (test::*) (int)
答案 1 :(得分:1)
int(Dy::*pSomeMethod)() = (int( Dy::*)())&Dx::SomeMethod;
类型已选中,因此没有来自编译器的抱怨。
至于:
Dy::pSomeMethod();
这是__cdecl。 但是,SomeMethod是__thiscall,这意味着它真的像这样
int SomeMethod( Dx &this);
因此,链接器无法找到匹配项。
如果没有Dx类的对象,你根本无法调用非静态方法。
答案 2 :(得分:1)
您对pSomeMethod
的声明定义了指向类Dy
中返回int
的函数的指针。您希望将其声明为链接器错误中显示的内容:
int (*Dy::pSomeMethod)();
是Dy
的成员,它是指向返回int
的函数的指针。
您尝试做的事情不会奏效,因为Dx::SomeMethod
是Dx
的成员函数,需要this
指针。通过pSomeMethod
拨打电话不会有一个。
完成后,您可以在不使用强制转换的情况下将函数的地址分配给指针。