Передача QLocalSocket * методу, ожидающему QIODevice * - PullRequest
0 голосов
/ 07 января 2011

Возможно, я слишком амбициозен, но я пытаюсь написать серверную программу, которая может принимать соединения как через QLocalSockets, так и через QTcpSockets.Идея состоит в том, чтобы иметь объект 'nexus' с QLocalServer и QTcpServer, который прослушивает новые соединения:

    Nexus::Nexus(QObject *parent)
        : QObject(parent)
    {
        // Establish a QLocalServer to deal with local connection requests:
        localServer = new QLocalServer;

        connect(localServer, SIGNAL(newConnection()),
                this,        SLOT(newLocalConnection()));
        localServer -> listen("CalculationServer");


        // Establish a UDP socket to deal with discovery requests:
        udpServer = new QUdpSocket(this);
        udpServer -> bind(QHostAddress::Any, SERVER_DISCOVERY_PORT);
        connect(udpServer, SIGNAL(readyRead()),
                this,      SLOT(beDiscovered()));

        // Establish a QTcpServer to deal with remote connection requests:
        tcpServer = new QTcpServer;

        connect(tcpServer, SIGNAL(newConnection()),
                this,      SLOT(newTcpConnection()));
        tcpServer -> listen(QHostAddress::Any, SERVER_COMMAND_PORT);
    }

..., а затем разделяет слоты, которые устанавливают объект сервера, конструктор которого принимает указатель наQIODevice.Теоретически, это должно работать, потому что и QLocalSocket, и QTcpSocket наследуют QIODevice.Вот слот newLocalConnection, например:

void Nexus::newLocalConnection()
{
    // Create a new CalculationServer connected to the newly-created local socket:
    serverList.append(new CalculationServer(localServer -> nextPendingConnection()));

    // We don't allow more than one local connection, so stop listening on the server:
    localServer -> close();
}

Проблема в том, что он не будет компилироваться, выдавая ошибку:

ошибка C2664: 'CalculationServer :: CalculationServer (QIODevice *, QObject *) ': невозможно преобразовать параметр 1 из' QLocalSocket * 'в' QIODevice * '1> Указанные типы не связаны;преобразование требует reinterpret_cast, приведение в стиле C или приведение в стиле функции

Теперь указанные типы явно не не связаны, и в других местах моего кода у меня вообще нет проблемдействия вроде:

QLocalSocket *socket = new QLocalSocket;
QIODevice    *server = new QIODevice;

server = socket;

... так может кто-нибудь сказать мне, почему у компилятора такая проблема?Есть ли способ, которым я могу заставить конструктор принять QLocalServer *?Я предполагаю, что есть ядерная опция получения конструктора для получения указателя void плюс дополнительной переменной, чтобы сообщить ему, что он отправляется, так что он может затем преобразовать указатель void в QLocalSocket или QTcpSocket, но я чувствую себя некомфортно, прибегая к reinterpret_castна то, что выглядит так, как будто это должен быть простой бит полиморфизма C ++.

С уважением,

Stephen.

1 Ответ

1 голос
/ 07 января 2011

Наиболее вероятная причина в том, что вы забыли #include <QLocalSocket> в исходном файле, где произошла ошибка.

...