2011-01-07 13 views
0

Vielleicht bin ich zu ehrgeizig, aber ich versuche ein Serverprogramm zu schreiben, das Verbindungen über QLocalSockets und QTcpSockets akzeptiert. Das Konzept ist eine ‚Verknüpfung‘ mit dem Objekt zu haben, sowohl eine QLocalServer und QTcpServer für neue Verbindungen zu hören:Einen QLocalSocket * an eine Methode übergeben, die einen QIODevice erwartet *

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

... und dann separate Steckplätze, die ein Server-Objekt aufzubauen, für dessen Konstruktor einen Zeiger auf eine QIODevice. In der Theorie sollte diese funktionieren, weil sowohl QLocalSocket und QTcpSocket QIODevice erben. Hier ist der newLocalConnection Schlitz, zum Beispiel:

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

Das Problem ist, dass dies nicht kompiliert wird, einen Fehler geben:

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

Nun sind die Typen wies auf deutlich nicht in keinem Zusammenhang, und an anderer Stelle in meinem Code habe ich überhaupt keine Probleme mit Aktionen wie:

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

server = socket; 

... so kann mir jemand sagen, warum der Compiler ein Problem mit t hat seine? Gibt es eine Möglichkeit, den Konstruktor den QLocalServer * akzeptieren zu lassen? Ich nehme an, es gibt die nukleare Option, den Konstruktor dazu zu bringen, einen void-Zeiger plus eine zusätzliche Variable zu nehmen, um ihm mitzuteilen, was gesendet wird. Er kann dann den void-Zeiger entweder auf QLocalSocket oder QTcpSocket umwandeln, aber ich fühle mich unwohl bei reinterpret_cast auf etwas, was aussieht, als ob es ein einfaches bisschen C++ Polymorphismus wäre.

Grüße,

Stephen.

Antwort

1

Der wahrscheinlichste Grund ist, dass Sie in der Quelldatei, in der der Fehler auftritt, #include <QLocalSocket> vergessen haben.

+0

Güte, ja, das behebt es. Vielen Dank. Ich nehme an, ich habe angenommen, dass es in qlocalserver.h referenziert wurde, aber offensichtlich nicht. –

Verwandte Themen