在 c ++ 里,当设计一个底层类的时候,上游不晓得上游具体的类是什么,又须要调上游的办法 (比方通过通信获取到了数据, 须要将数据回传到上游),解决办法是将上游类的成员函数(其余函数同理) 充当回调函数,传递给上游。
上游类:mainwindow
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class ServerProvider;
QT_BEGIN_NAMESPACE
namespace Ui {class MainWindow;}
QT_END_NAMESPACE
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow() override;
void getData(const QString &str);
private:
Ui::MainWindow *ui;
ServerProvider *m_serverProvider;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <functional>
#include "serverprovider.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);
FuncDef func;
func = std::bind(&MainWindow::getData, this, std::placeholders::_1);
m_serverProvider = new ServerProvider();
m_serverProvider->setFunc(func);
}
MainWindow::~MainWindow() { delete ui;}
void MainWindow::getData(const QString &str) {qDebug() << "GET DATA:" << str;
}
上游类:serverprovider
#ifndef SERVERPROVIDER_H
#define SERVERPROVIDER_H
#include <functional>
class QString;
typedef std::function<void(const QString &str)> FuncDef;
class ServerProvider {
public:
ServerProvider();
void setFunc(FuncDef func);
private:
FuncDef m_func;
};
#endif // SERVERPROVIDER_H
#include "serverprovider.h"
#include <QString>
ServerProvider::ServerProvider() {}
void ServerProvider::setFunc(FuncDef func) {
this->m_func = func;
// 假如此处取得数据
//(理论场景这个办法只做 setFunc, 应该是在某个触发条件下调用 m_func)
QString str = "Hello World!";
this->m_func(str);
}