using System.Windows.Forms;class MyForm : Form
{
static void Main()
{
Button btn = new Button();
btn.Parent = this;
btn.Click = new EventHandler(OnBtnClick); Application.Run(new MyForm);
} protected void OnBtnClick(Object Sender, EventArgs)
{
...
}
}在这里,按钮的点击响应由一个时间委托来完成,响应函数用的是MyForm类的成员函数,用static也可以。请问:1: 它通过什么手段来回调类的成员函数,因为类的成员函数的地址在运行时才知道,不同于static函数;2: 如果我要用C++自己实现一套这样的事件响应应该怎么做?就是我也可以用我的类的成员函数作为回调函数;3: .NET里面的消息处理和父子窗体的通信是如何进行的? 谢谢! 提供相关资料也可以。
{
static void Main()
{
Button btn = new Button();
btn.Parent = this;
btn.Click = new EventHandler(OnBtnClick); Application.Run(new MyForm);
} protected void OnBtnClick(Object Sender, EventArgs)
{
...
}
}在这里,按钮的点击响应由一个时间委托来完成,响应函数用的是MyForm类的成员函数,用static也可以。请问:1: 它通过什么手段来回调类的成员函数,因为类的成员函数的地址在运行时才知道,不同于static函数;2: 如果我要用C++自己实现一套这样的事件响应应该怎么做?就是我也可以用我的类的成员函数作为回调函数;3: .NET里面的消息处理和父子窗体的通信是如何进行的? 谢谢! 提供相关资料也可以。
OnBtnClick 标志2。C++ 不太清楚。3. .NET里面的消息处理和父子窗体的通信是如何进行的?
——————————————————————————
这两者似乎没有关联性吧。
static方法中也可以使用this?
1: 它通过什么手段来回调类的成员函数,因为类的成员函数的地址在运行时才知道,不同于static函数;
事实上所有的方法都是在编译时完成地址计算的,静态成员属性是编译时计算地址的,而非静成属性只有运行时才能知道地址。2: 如果我要用C++自己实现一套这样的事件响应应该怎么做?就是我也可以用我的类的成员函数作为回调函数;
在你的类中定义函数指针,然后将外面的函数对其赋值即可。
3: .NET里面的消息处理和父子窗体的通信是如何进行的?
消息处理和MFC中还是差不多的。只是看起来可能更舒服一些了。如果想知道更多,可以反编译后的
System.Window.Forms
btn.Parent = this;
btn.Parent = this;
都有错误
{
static void Main()
{
Application.Run(new MyForm);
} public MyForm()
{
Button btn = new Button();
btn.Parent = this;
btn.Click = new EventHandler(OnBtnClick); } protected void OnBtnClick(Object Sender, EventArgs)
{
...
}
}//To begincsdn:class A
{public: virtual void vfunc1();
virtual void func2(); typedef (A::*FUNC)(); FUNC func;}class B
{
public:
virtual void vfunc1();
}B b = B();b.func = &B::vfunc1; (编译通不过)2: 如果定义了一个基类的函数指针, 就象上面的示例,它不能指向派生类的虚函数;3: 你说的还是差不多是指什么? 父窗口什么时候来创建子窗口,如果查找子窗口?调用哪些函数来做这些动作? 你能用C++实现委托技术么?如果仅仅使用函数指针,不但象上面的写法很奇怪,而且使用起来也有问题,调用这个函数的时候需要实例化类的参与。我觉得.NET应该是使用了反射技术, 不知道哪位能用C++实现一下这套机制。
在静态方法里面不能直接引用非静态的方法(成员),必须通过实例对象引用。烦劳楼主编译通过了再来问哈,编译都通不过的东西就是无法实现。
1、从代理的构造来看
public class FeedBack:System.MulticastDelegate{
public FeedBack(Object target,Int32 methodPtr);
成员:System.Object _target;
System.Int32 _methodPtr;
System.MulticastDelegate _prev;
方法:
combine,
remove
……
}
利用_target和_methodPtr,找到方法地址调用。
当然是知道了对象的成员地址才调用的。这个调用过程应该是使用了reflection吧
2、C++中可以使用回调方法的指针链表,我觉得就能理解这里的事件响应了吧,
b.func = &B::vfunc1; (编译通不过),
这里应该是b.func=&b.vfunc1吧
3、.NET里面的父子消息机制,与mfc是类似的吧,我觉得根本都是windows的窗体通信机制,mfc和.net都只是封装了而已
1.C++在编译时就知道类成员函数的地址。
2.主要用到模版偏特化,具体实现可以参见boost::function。
3.net不像MFC,因为不是派生结构,所以不需要父子互相传递消息。
消息直接发到对应的控件就可以了,下一代的操作系统直接就没消息这个概念了。