私はstd::function
を使用してC++でコールバックを使用しようとしています。私は2つのファイル、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
エラーを生成する行を指定した場合に役立ちます。私はそれがそのエラーを引き起こすかどうかわからないという1つの問題があると思う。あなたのコンストラクタのonCompletionCallbackパラメータは 'std :: functionへのポインタ'なので、 'std :: function '型のオブジェクトに逆参照なしで代入するのはあなたの望むものではありません。パラメータから*を削除するか、初期化を 'onCompletionCallback(* onCompletionCallback)'に変更してください。 –
Eelke