Domanda

Forse devo essere troppo ambizioso, ma sto cercando di scrivere un programma server che può accettare connessioni su entrambi i QLocalSockets e QTcpSockets. Il concetto è quello di avere un oggetto 'nesso' sia con un ascolto QLocalServer e QTcpServer per nuove connessioni:

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

... e poi gli slot separati che stabiliscono un oggetto server, il cui costruttore prende un puntatore ad un QIODevice. In teoria, questo dovrebbe per lavoro, perché sia ??QLocalSocket e QTcpSocket ereditano QIODevice. Ecco lo slot newLocalConnection, ad esempio:

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

Il problema è che questo non si compila, dando un errore:

  

Errore C2664:   'CalculationServer :: CalculationServer (QIODevice   *, QObject *)': non può convertire il parametro 1 da 'QLocalSocket *' per   'QIODevice *' 1> Tipi di punte   per non sono correlati; conversione richiede   reinterpret_cast, cast di tipo C o   cast di tipo funzione

Ora i tipi hanno indicato sono chiaramente non non collegati, e altrove nel mio codice non ho problemi a tutti con azioni come:

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

server = socket;

... così qualcuno può dirmi il motivo per cui il compilatore ha un problema con questo? C'è un modo che io possa fare il costruttore accetta l'QLocalServer *? Suppongo che ci sia l'opzione nucleare di ottenere il costruttore di prendere un puntatore nullo, più una variabile in più per dire che quello che è stato inviato, in modo che possa poi riformulare il puntatore nullo, o un QLocalSocket o QTcpSocket, ma mi sento ricorrendo a disagio a reinterpret_cast su quello che sembra che dovrebbe essere un po 'semplice di C ++ polimorfismo.

Saluti,

Stefano.

È stato utile?

Soluzione

La ragione più probabile è che si è dimenticato di #include <QLocalSocket> nel file di origine in cui si verifica l'errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top