2011-01-07 4 views
0

Peut-être que je suis trop ambitieux, mais j'essaye d'écrire un programme serveur qui peut accepter des connexions sur QLocalSockets et QTcpSockets. Le concept est d'avoir un objet « nexus » à la fois un QLocalServer et QTcpServer écouter de nouvelles connexions:Passage d'un QLocalSocket * à une méthode qui attend un QIODevice *

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

... et puis fentes séparées qui établissent un objet serveur, dont le constructeur prend un pointeur vers une QIODevice. En théorie, ce devrait fonctionner car QLocalSocket et QTcpSocket héritent de QIODevice. Voici la fente newLocalConnection, par exemple:

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

Le problème est que cela ne compile pas, ce qui donne une erreur:

error C2664: 'CalculationServer::CalculationServer(QIODevice *,QObject *)' : cannot convert parameter 1 from 'QLocalSocket *' to 'QIODevice *' 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Maintenant, les types sont clairement souligné pas sans rapport, et ailleurs dans mon code que j'ai aucun problème avec des actions telles que:

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

server = socket; 

... si quelqu'un peut me dire pourquoi le compilateur a un problème avec t le sien? Existe-t-il un moyen pour que le constructeur accepte le QLocalServer *? Je suppose qu'il y a l'option nucléaire d'amener le constructeur à prendre un pointeur vide plus une variable supplémentaire pour lui dire ce qu'il est envoyé, donc il peut alors refondre le pointeur vide vers un QLocalSocket ou un QTcpSocket, mais je me sens mal à l'aise de reinterpret_cast sur ce qui semble être un simple polymorphisme C++.

Cordialement,

Stephen.

Répondre

1

La raison la plus probable est que vous avez oublié #include <QLocalSocket> dans le fichier source où l'erreur se produit.

+0

Mon Dieu, oui, ça le corrige. Je vous remercie. Je suppose que je supposais qu'il était référencé dans qlocalserver.h, mais évidemment pas. –

Questions connexes