Ошибка С2550 и как её обойти

357
18 ноября 2017, 12:06

Выпадает ошибка(ошибка: 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).

Answer 1

Конструкция, которую Вы пытаетесь использовать в строке

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.

READ ALSO