在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);
}
发表回复