C++回调函数和this指针的实例

--------------------- 
作者:徐小hi 
来源:CSDN 
原文:https://blog.csdn.net/u010177010/article/details/50837067 
版权声明:本文为博主原创文章,转载请附上博文链接!

在做到界面开发的过程中,往往需要通过子窗口去操作父窗口的问题。方法很多,大致实现下回调函数和类静态对象的使用。

在类的非静态函数的形参列表里,有个隐含的this指针,但是静态成员函数没有this指针,所以类的静态成员函数无法调用非静态的成员。要想在静态成员函数里调用成员,需要将当前的this指针传进去。在下面的例子都有实现。  

每次创建类的对象都会相应的生成this指针,指向这个实例化对象。

直接上代码: (通过qt写的)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include
#include "mainwindowson.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    static MainWindow *Instance();
 
    static MainWindow *m_instance;
    mainwindowson *ceshi;
    void press(void * t,QString str);
    void static setText(void *args,QString text);
 
private slots:
    void on_pushButton_clicked();
 
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
#define  Ivdt_Com    MainWindow::Instance()//可以使ceshi.cpp里面调用,方便别的cpp调用

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
    ceshi = new mainwindowson();
    ceshi->reg_cb(setText,this);//将该窗口的地址和函数传给子窗口
    ceshi->exec();
}
void MainWindow::press(void * t,QString str)
{
    MainWindow *pDownLoad = (MainWindow *)t;
    pDownLoad->ui->lineEdit->setText(str);
    int a = 123;
}
void MainWindow::setText(void *args,QString text)
{
    MainWindow *pDownLoad  = (MainWindow *)args;
    pDownLoad->ui->lineEdit->setText(text);
    //静态成员函数不存在this指针,所以将当前窗口指针传进来
}
MainWindow *MainWindow::Instance()
{
//    if (!m_instance)
//    {
//        m_instance = new MainWindow();
//    }
//    return m_instance;
    static  MainWindow instance_;
    return &instance_;//返回当前窗口对象的地址并不是当前的窗口地址是新的对象的地址
}

 

#ifndef MAINWINDOWSON_H
#define MAINWINDOWSON_H
 
#include
 
namespace Ui {
class mainwindowson;
}
typedef void(*up_func)(void *,QString text);
class mainwindowson : public QDialog
{
    Q_OBJECT
 
public:
    explicit mainwindowson(QWidget *parent = 0);
    ~mainwindowson();
    up_func p_func;
    void * p_args;
    void reg_cb(up_func func,void *args = NULL)
    {
        p_func = func;
        p_args = args;
    }
 
 
private slots:
    void on_pushButton_clicked();
private:
    Ui::mainwindowson *ui;
};
 
#endif // MAINWINDOWSON_H

 

#include "mainwindowson.h"
#include "ui_mainwindowson.h"
#include "mainwindow.h"
mainwindowson::mainwindowson(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::mainwindowson)
{
    ui->setupUi(this);
}
 
mainwindowson::~mainwindowson()
{
    delete ui;
}
 
void mainwindowson::on_pushButton_clicked()
{
    Ivdt_Com->press(p_args,"press");
    //p_func(p_args,"huidiao");
    //Ivdt_Com->setText(p_args,"sds");
 
    //p_args是mainwindow窗口的地址,通过在构造其子窗口的时候
    //将地址传给子窗口,没有此地址,子窗口无法对父窗口进行操作
}

 

#include "mainwindow.h"
#include
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;//w的地址就是存在this指针
    w.show();
 
 
    return a.exec();
}

 

你可能感兴趣的:(C++,Qt)