首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求好手,成员函数指针 类型转换 失败

2013-12-19 
求高手,成员函数指针 类型转换 失败class FuncClass{public:void theHandler(int param)}typedef void (

求高手,成员函数指针 类型转换 失败


class FuncClass
{
public:
void theHandler(int param);
};
typedef void (FuncClass::*ptheHandler)(int param);

class base
{

};
class CUse : base
{
public:
static void Test1();
virtual void Test2();
void Test3(int iTest);
void Test4(int param);
static int m_iStatic;
int m_iTest;
};

int SomeFunc()
{
ptheHandlerp2;
p2 = (ptheHandler)&CUse::Test4;
}


VC2008:
error C2440: “类型转换”: 无法从“void (__thiscall CUse::* )(int)”转换为“ptheHandler”
1>        指向成员的指针有不同的表示形式;无法在它们之间进行类型转换

当CUse::Test2()为virtual,并且继承base,出现以上错误。而只要这两点没有同时满足,则无错误。
当这两点同时满足,且FuncClass也满足这两点,也会正确。

想请教一下有虚函数,且是子类的类  和  不满足这两点的类,
有同样函数声明的 成员函数指针 有什么区别?为何不能相互转换?
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

void Test4(int param); 
本质上是
void Test4(CUse *this, int param); 

你定义的p2是
void p2(FuncClass *this, int param); 

两者当然无法兼容


不同类的成员函数指针是可以转换的,我1楼有说,在一般情况下,我是转换成功了的


就是CUse *和FuncClass *之间是否能强转. 你定义的两个类, 一个有virtual函数,一个没有,肯定不行.

强转的后果自负。
这种时候根本不能上强制转换。


我只是想要弄一个C#式的委托。。。
这个问题我已经搞了一天多了,还有什么好办法实现委托或事件机制?

有 std::function 和 lamdba
[解决办法]
虚函数的指针是很麻烦的一件事情,且据说其实现也是编译特定的。 这是因为虚函数指针在调用时也是有多态的,所以比普通指针要额外保存一些信息,并且在调用时生成的机器代码也是不同的,所以即使你绕开了编译器限制强转成功,调用时也不会有好下场的。

去google里搜 "The Impossibly Fast C++ Delegates"。 或者如上面有人推荐的 std::function。
如果不是很特别的用途,我会选 std::function,不过  Sergey Ryazanov 的 Impossibly Fast C++ Delegates 还是值得一看的,比较有意思。
[解决办法]
引用:
虚函数的指针是很麻烦的一件事情,且据说其实现也是编译特定的。 这是因为虚函数指针在调用时也是有多态的,所以比普通指针要额外保存一些信息,并且在调用时生成的机器代码也是不同的,所以即使你绕开了编译器限制强转成功,调用时也不会有好下场的。

去google里搜 "The Impossibly Fast C++ Delegates"。 或者如上面有人推荐的 std::function。
如果不是很特别的用途,我会选 std::function,不过  Sergey Ryazanov 的 Impossibly Fast C++ Delegates 还是值得一看的,比较有意思。


http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html
就是这篇哈。

楼主如果愿意,可以把函数定义成static

std::function,和std::bind配合使用,也无法传递不定参数,只不过std::function,和std::bind写了10份类似的接口,允许你最多传入10个参数的函数指针

热点排行