2017-04-01 67 views
0

我一直在努力使指向做这样的事情(视觉C++)的方法的指针函数指针的静态方法这样的:指向没有静态方法

struct Dx 
{ 
    int SomeMethod() 
    { 
     return 4; 
    } 
}; 

struct Dy 
{ 
    static int(*pSomeMethod)();  
}; 

int(Dy::*pSomeMethod)() = (int(Dy::*)())&Dx::SomeMethod; 

到目前为止好,这个编译没有问题,但如果我尝试打电话给她:

Dy::pSomeMethod(); 

钍Ë编译器返回我:

Error 1 error LNK2001: external symbol "public: static int (__stdcall * Dy::pSomeMethod) (void)" (? [email protected]@@2P6GHXZA) unresolved

我不明白,因为它不是想pSomeMethod他是不是在SomeMethod指点?

+1

你不明白一个函数指针和一个类的方法指针之间的根本区别。他们是两个完全不同的东西,你不能在两者之间进行转换。您也不能将一个类的类方法指针转换为另一个类的类方法指针。 –

回答

1

&test::tst的类型是int (test::*) (int),这是的成员函数指针

您正在试图将其转换为定期指针类型,因为它们是完全不同的,这是不可能。

这就是为什么你会有这样类型转换错误:

error C2440: 'type cast' : 
cannot convert from 'int (__thiscall test::*)(int)' to 'int (__cdecl *)(int)' 
1
int(Dy::*pSomeMethod)() = (int(Dy::*)())&Dx::SomeMethod; 

类型检查,所以没有从编译器的抱怨。

至于:

Dy::pSomeMethod(); 

这是一个__cdecl。 但是,是的someMethod一个__thiscall,这意味着它真的很喜欢这个

int SomeMethod(Dx &this); 

所以,链接器无法找到匹配。

你根本就没有一流的DX对象调用非静态方法。

1

您的pSomeMethod声明定义了一个指向类Dy中函数的指针,该函数返回int。你想,因为它出现在链接错误来声明它:

int (*Dy::pSomeMethod)(); 

这是Dy成员是一个指向返回一个int的功能。

你试图做的事情将不起作用,因为Dx::SomeMethodDx的成员函数,它需要一个this指针。调用pSomeMethod将不会有一个。

如果做得正确,你可以指定函数指针的地址不使用演员。