std::function
을 사용하여 C++에서 콜백을 사용하려고합니다. 두 파일, mainwindow.cpp
및 tcpclient.cpp
이 있습니다. mainwindow
의 멤버 함수는 특정 경우에 전달 된 함수를 호출하기 위해 tcpclient
으로 전달됩니다.C++에서 콜백을 사용하는 방법은 무엇입니까?
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
을 사용하여 콜백을 전달하려면 어떻게해야합니까?
편집 : 첫 번째 의견에 따라,이 질문과 관련없는 코드 부분을 제거하여 선명도를 향상시킵니다.
http://idownvotedbecau.se/toomuchcode/ – Murphy
을 확인하는 것입니다. 나는 명확성을 향상시키기 위해 무관 한 코드 부분을 제거했습니다. 앞으로 게시 할 때이를 명심하십시오. 이유를 설명해 주셔서 감사합니다. – Vino
오류를 생성하는 행을 지정한 경우 도움이됩니다. 한 가지 문제가 그 오류를 일으키는 지 확실하지 않다고 생각하는 것 같습니다. 생성자의 onCompletionCallback 매개 변수는'std :: function에 대한 포인터'이므로 참조 해제하지 않고'std :: function '유형의 객체에 할당하는 것은 원하지 않습니다. 매개 변수에서 *를 제거하거나 초기화를 'onCompletionCallback (* onCompletionCallback)'으로 조정하십시오. –
Eelke