函数指针的问题

daview 2006-09-27 04:57:14
全局定义:

typedef LRESULT(CALLBACK* MyProc)(DWORD, DWORD);

class MyClass
{
public:
void Do()
{
MyProc p1 = Proc;
MyProc p2 = MyClass::Proc;
MyProc p3 = &MyClass::Proc;
typedef LRESULT (CALLBACK MyClass::*TMP)(DWORD, DWORD);
TMP p4 = &MyClass::Proc;
TMP p5 = this->Proc;
TMP p6 = &Proc;
p4(0, 0);
}

LRESULT CALLBACK Proc(DWORD, DWORD)
{
return 0;
}
}

在以上代码中,DO函数的6个变量只有p4能编译通过,但调用p4(0,0)失败。
...全文
397 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
varphone 2006-10-02
  • 打赏
  • 举报
回复
friend Proc()
w_anthony 2006-09-30
  • 打赏
  • 举报
回复
楼上的真的试过么?
TMP p4 = &MyClass::Proc; //非static函数是可以的哦

以下两者,非static函数不能通过编译,static没试过,估计也不行
daview 2006-09-30
  • 打赏
  • 举报
回复
下面我要说的话,可能几位会不高兴。

我从DOS下用ASM编程开始,后来由于工作关系离开了开发工作一段时间,再进来已经是使用.NET高级工具了。

现在想重新使用VC开发,至于什么OOP,对我不存在什么类和对象实例这样概念混淆的问题。

我的问题大家都没有看清楚就在这里“学面向对象编程,一定要区分类和对象实例的不同。静态函数是不需要生成实例来调用的”,一顶大帽子的扣,真郁闷
mynamelj 2006-09-30
  • 打赏
  • 举报
回复
TMP p4 = &MyClass::Proc; // 这种方法,不需要实例化对象,即static函数
TMP p5 = this->Proc; // 这种方法必是一个对象实例化后才可以
TMP p6 = &Proc; // 如上
w_anthony 2006-09-30
  • 打赏
  • 举报
回复
(this->*p4)(0,0)这样用就对了;

TMP p4最好不要做成员函数,不然退出可能会挂掉,“如果把非实例定义类的成员函数附加到成员上,该怎么处理?”这句话是不是要每个对象都有一个成员函数入口地址的意思啊?如果是的话,定义为virtual就可以了
AthlonxpX86 2006-09-29
  • 打赏
  • 举报
回复
原型不一样当然不行。不是静态函数,就必须有个对象实例来调用。

学面向对象编程,一定要区分类和对象实例的不同。静态函数是不需要生成实例来调用的。

非静态函数也可以不用实例调用的,只要不是虚拟函数,所有函数实质上都是静态的,不过用的时候要传递this指针X86上一般调用函数之前要mov ecx,this
daview 2006-09-29
  • 打赏
  • 举报
回复
up
waterczh 2006-09-28
  • 打赏
  • 举报
回复
MARK
daview 2006-09-28
  • 打赏
  • 举报
回复
clever101(虽然我给的分不多,可是只要有回复我都有结贴的俄)
提供的地址暂时解决了我的问题。

我的目的是这样的:

给类定义一个事件,然后给这个事件附加处理方法,当满足事件条件的时候就触发事件,执行事件上附加的方法。
(大家用过.net应该知道.net里面的事件)

现在,我通过对类内部的处理方法已经解决。

新的问题是:

如果把非实例定义类的成员函数附加到成员上,该怎么处理?

我分析了代码,感觉在“clever101(虽然我给的分不多,可是只要有回复我都有结贴的俄) ”提供的代码中,关键是要解决TSpecialFunctor模板类定义时怎么用通用类型名替代TClass,但我不知道。

如果完成了,本人将很乐意把代码奉献出来。
长尾巴的悟空 2006-09-27
  • 打赏
  • 举报
回复
up
huamoran 2006-09-27
  • 打赏
  • 举报
回复
静态函数是不需要生成实例来调用的。
但实例也能用!
clever101 2006-09-27
  • 打赏
  • 举报
回复
Mackz(在相互)说得有道理。看看这篇文章:
http://www.newty.de/fpt/functor.html
菜牛 2006-09-27
  • 打赏
  • 举报
回复
原型不一样当然不行。不是静态函数,就必须有个对象实例来调用。

学面向对象编程,一定要区分类和对象实例的不同。静态函数是不需要生成实例来调用的。
daview 2006-09-27
  • 打赏
  • 举报
回复
至于其它的P的定义是乱来的,发现问题就各种可能进行尝试了。

(*p4)(0,0)

调用也是错误的,编译不通过。

clever101 2006-09-27
  • 打赏
  • 举报
回复
TMP p5 = this->Proc;
TMP p6 = &Proc;

这两种用法都是错误的。

quote:这个好像要用 static 的 proc 函数

并不需要static 的 proc 函数
daview 2006-09-27
  • 打赏
  • 举报
回复
用static能解决,这个我知道。我现在是想让这个proc函数是非STATIC的。
clever101 2006-09-27
  • 打赏
  • 举报
回复
p4(0,0)? 有这样用的吗?(*p4)(0,0)吧
碧螺春的马甲 2006-09-27
  • 打赏
  • 举报
回复
这个好像要用 static 的 proc 函数

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧