2011-01-07 3 views
0

Возможно, я чересчур амбициозен, но я пытаюсь написать серверную программу, которая может принимать соединения как с QLocalSockets, так и с QTcpSockets. Концепция должны иметь «нексус» объект с одновременно QLocalServer и QTcpServer прослушивания новых соединений:Передача QLocalSocket * методу, ожидающему 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); 
    } 

... а затем отдельные слоты, которые создают серверный объект, конструктор которого принимает указатель на 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(); 
} 

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

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

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

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

server = socket; 

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

С уважением,

Стефан.

ответ

1

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

+0

Доброта, да, это исправляет. Спасибо. Наверное, я предположил, что это было указано в qlocalserver.h, но, очевидно, нет. –