在c++里,当设计一个底层类的时候,上游不晓得上游具体的类是什么,又须要调上游的办法(比方通过通信获取到了数据,须要将数据回传到上游),解决办法是将上游类的成员函数(其余函数同理)充当回调函数,传递给上游。
上游类:mainwindow
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>class ServerProvider;QT_BEGIN_NAMESPACEnamespace Ui {class MainWindow;}QT_END_NAMESPACEclass 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);}