Выпадает ошибка(ошибка: C2550: MainWindow::MyClient: список инициализации конструктора должен использоваться только в месте определения конструктора) хочу сделать клиент для простейшего чата.
Вот код который надеюсь все пояснит mainwindow.h
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
#include <QtNetwork>
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void MyClient(const QString& strHost, int nPort) ;
QTcpSocket* m_pTcpSocket;
quint16 m_nNextBlockSize;
private slots:
void slotReadyRead ( );
void slotError (QAbstractSocket::SocketError);
void slotSendToServer( );
void slotConnected ( );
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Вот код где выпрыгивает ошибка mainwindow.срр
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::MyClient(const QString& strHost, int nPort ):m_nNextBlockSize(0)
{
// m_pTcpSocket = new QTcpSocket(this);
m_pTcpSocket->connectToHost(strHost, nPort);
connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected()));
connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()));
connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(slotError(QAbstractSocket::SocketError)));
connect(ui->lE_input, SIGNAL(returnPressed()),this,SLOT(slotSendToServer()));
connect(ui->pB_send, SIGNAL(clicked()), SLOT(slotSendToServer()));
connect(ui->lE_input, SIGNAL(returnPressed()),this, SLOT(slotSendToServer()));
}
void MainWindow::slotReadyRead()
{
QDataStream in(m_pTcpSocket);
in.setVersion(QDataStream::Qt_4_7);
for (;;) {
if (!m_nNextBlockSize) {
if (m_pTcpSocket->bytesAvailable() < (int)sizeof(quint16)) {
break;
}
in >> m_nNextBlockSize;
}
if (m_pTcpSocket->bytesAvailable() < m_nNextBlockSize) {
break;
}
QTime time;
QString str;
in >> time >> str;
ui->tB_text->append(time.toString() + " " + str);
m_nNextBlockSize = 0;
}
}
void MainWindow::slotError(QAbstractSocket::SocketError err)
{
QString strError =
"Error: " + (err == QAbstractSocket::HostNotFoundError ?
"The host was not found." :
err == QAbstractSocket::RemoteHostClosedError ?
"The remote host is closed." :
err == QAbstractSocket::ConnectionRefusedError ?
"The connection was refused." :
QString(m_pTcpSocket->errorString()));
ui->tB_text->append(strError);
}
void MainWindow::slotSendToServer()
{
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << quint16(0) << QTime::currentTime() << ui->lE_input->text();
out.device()->seek(0);
out << quint16(arrBlock.size() - sizeof(quint16));
m_pTcpSocket->write(arrBlock);
ui->lE_input->setText("");
}
void MainWindow::slotConnected()
{
ui->tB_text->append("Received the connected() signal");
}
Настроке последющей после этого кода,
void MainWindow::MyClient(const QString& strHost, int nPort ):m_nNextBlockSize(0)
он выкидывает ошибку
C:\WorkQt\MyClient\mainwindow.cpp:17: ошибка: C2550: MainWindow::MyClient: список инициализации конструктора должен использоваться только в месте определения конструктора
Атрибут m_nNextBlockSize служит для хранения длины следующего полученного от сокета блока
где я допустил ошибку и как сделать этот код удобным (что бы был разложен по блокам, что бы можно было бы вырезать и вставить в другой проект).
Весь код я выложил кроме .ui файла, но там ничего интересного : один QTextBrowser (tB_text), одна кнопка (pB_send), один QLineEdit (lE_input).
Конструкция, которую Вы пытаетесь использовать в строке
void MainWindow::MyClient(const QString& strHost, int nPort ):m_nNextBlockSize(0)
называется список инициализации. Но она применима только в конструкторах. В других функциях использовать нельзя.
Но если нельзя, а сильно хочется? Нужно писать по старинке, явно:
void MainWindow::MyClient(const QString& strHost, int nPort )
{
m_nNextBlockSize = 0;
//... весь остальной код
}
Сам код конечно страшненький, но... это такое. Я бы только функцию slotError переписал через switch-case или map.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Можно ли вместо ZeroMemory(x,sizeof(x)) использовать Zero(x)?