【发布时间】:2017-12-25 02:21:49
【问题描述】:
我正在尝试使用 std::function 在 c++ 中使用回调。我有两个文件,mainwindow.cpp 和 tcpclient.cpp。将mainwindow 的成员函数传递给tcpclient,以便在某个事件发生时调用传递的函数。
mainwindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
void connectedToServer(int errorCode);
~MainWindow();
private slots:
void on_connectButton_clicked();
TCPClient *tcpClient_;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
tcpClient_ = &TCPClient("localhost", ui->portText->text(), ui->consoleText, this->connectedToServer)
}
tcpclient.h
#ifndef TCPCLIENTH
#define TCPCLIENTH
#include <QTcpSocket>
#include <QString>
#include <QJsonDocument>
#include <QTextEdit>
#include <functional>
#include <tcpclientbadresponse.h>
#include <tcpclientserverdisconnected.h>
class TCPClient : public QTcpSocket
{
public:
TCPClient(QString hostName, int port, QString clientID, QTextEdit *consoleText,
std::function<void(int)> *onCompletionCallback);
void connectToServer(QString requestType, QJsonDocument requestJson);
QJsonDocument getResponse() const;
private:
std::function<void(int)> onCompletionCallback;
};
#endif // TCPCLIENTH
tcpclient.cpp
#include "tcpclient.h"
#include <QDebug>
#include <QIODevice>
#include <QAbstractSocket>
#include <QByteArray>
#include <exception>
TCPClient::TCPClient(QString hostName, int port, QString clientID, QTextEdit *consoleText,
std::function<void(int)> *onCompletionCallback)
: hostName_(hostName),
port_(port),
clientID_(clientID),
consoleText_(consoleText),
onCompletionCallback(onCompletionCallback)
{
this->connectionStatus_ = TCPClient::CONNECTION_STATUS::IDLE;
qDebug() << "Client " << clientID_ << " created";
}
我收到以下错误
必须调用非静态成员函数
这个错误是什么意思?如何使用std::function 传递回调?
编辑:根据第一条评论,我已删除与此问题无关的代码部分以提高清晰度。
【问题讨论】:
-
我同意。我删除了不相关的代码部分以提高清晰度。以后发帖时我会牢记这一点。感谢您提供拒绝投票的理由。
-
如果您指定哪一行会产生该错误,将会有所帮助。我想我看到一个问题,我不确定它是否会导致该错误。构造函数的 onCompletionCallback 参数是
pointer to std::function<void(int)>,因此在不取消引用的情况下将其分配给std::function<void(int)>类型的对象不是您想要的。要么去掉参数中的*,要么调整初始化为onCompletionCallback(*onCompletionCallback)
标签: c++ qt std-function