c++:成员函数指针问题

来源:百度知道 编辑:UC知道 时间:2024/05/08 15:54:48
错误代码如下:

class Control;
class Form;
class MainForm;

class Control
{
public:
    void exe()
    { 
        Form* f;
        (f->*_ptr)();
    }
    
    void (Form::*_ptr)();
    void setPtr( void (Form::*ptr)() )
        { _ptr = ptr; }
};

class Form
{

};

class MainForm : public Form
{
    Control c;
    void f();
    void init()
    {
        c.setPtr(&nb

好像报错这两种类型是不匹配的。
void (Form::*_ptr)();
void (MainForm::* func)();
给他强制转换一下:
typedef void (Form::*_ptr)();
c.setPtr( (func)&MainForm::f );
但是还是不明白你这样做的目的何在。调用另外一个类的成员函数,为什么不通过对象呢?或者静态成员函数也行啊!要不然声明control是MainForm的友元类。

在你原来的Control类的exec函数处理的有问题:
void exe()
{
Form* f; //f没有被实例化,调用成员函数_ptr就会报错。它指向的是无效地址
(f->*_ptr)();
}

我这样修改了下:Control接收到事件时(比如button被按下)它可以将这个消息传递给MainForm,由MainForm来判断并决定怎么做,而不是把MainForm的成员函数预先设定到Control里面。这样我觉得比函数指针要好理解些。
对每个Control设定它的parent,事件发生时,就调用parent的handleEvent函数。这里就是MainForm的handleEvent了。再在里面根据sender和message来调用不同的成员函数。

class Control;
class Form;
class MainForm;

class Form
{
public:
virtual void handleEvent(int sender, int message) = 0;
};

class Control
{
public:
void exe()
{
parent->handleEvent(1,1);
}