Pregunta

Tal vez estoy siendo demasiado ambicioso, pero estoy tratando de escribir un programa de servidor que puede aceptar conexiones a través de ambos QLocalSockets y QTcpSockets. El concepto es tener un objeto 'nexo' tanto con una escucha QLocalServer y QTcpServer para las nuevas conexiones:

    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);
    }

... y luego ranuras separadas que establecen un objeto de servidor, cuyo constructor toma un puntero a una QIODevice. En teoría, esto debe para el trabajo debido a que tanto QLocalSocket y QTcpSocket heredan QIODevice. Aquí está la ranura newLocalConnection, por ejemplo:

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();
}

El problema es que esto no se compilará, dando un error:

  

C2664 de error:   'CalculationServer :: CalculationServer (QIODevice   *, * QObject)': no ??se puede convertir el parámetro 1 de 'QLocalSocket *' para   'QIODevice *' 1> Tipos de puntas   a no están relacionados; conversión requiere   reinterpret_cast, conversión de estilo C o   conversión de estilo de función

Ahora los tipos señalaron son claramente no no relacionado, y en otros lugares en mi código tengo ningún problema en absoluto con acciones como:

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

server = socket;

... así que ¿alguien puede decirme por qué el compilador tiene un problema con esto? ¿Hay una manera que puedo hacer que el constructor acepta la QLocalServer *? Supongo que es la opción nuclear de conseguir el constructor para tener un puntero nulo, más una variable adicional para decir que lo que está siendo enviado, por lo que se puede refundir el puntero nulo ya sea a un QLocalSocket o QTcpSocket, pero me siento reordenación incómodo para reinterpret_cast en lo que parece que debería ser un poco más sencillo del polimorfismo C ++.

Saludos,

Stephen.

¿Fue útil?

Solución

La razón más probable es que se ha olvidado de #include <QLocalSocket> en el archivo de origen, donde se produce el error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top