在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);}