Возможно, я слишком амбициозен, но я пытаюсь написать серверную программу, которая может принимать соединения как через QLocalSockets, так и через QTcpSockets.Идея состоит в том, чтобы иметь объект 'nexus' с QLocalServer и QTcpServer, который прослушивает новые соединения:
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();
}
Проблема в том, что он не будет компилироваться, выдавая ошибку:
ошибка C2664: 'CalculationServer :: CalculationServer (QIODevice *, QObject *) ': невозможно преобразовать параметр 1 из' QLocalSocket * 'в' QIODevice * '1> Указанные типы не связаны;преобразование требует reinterpret_cast, приведение в стиле C или приведение в стиле функции
Теперь указанные типы явно не не связаны, и в других местах моего кода у меня вообще нет проблемдействия вроде:
QLocalSocket *socket = new QLocalSocket;
QIODevice *server = new QIODevice;
server = socket;
... так может кто-нибудь сказать мне, почему у компилятора такая проблема?Есть ли способ, которым я могу заставить конструктор принять QLocalServer *?Я предполагаю, что есть ядерная опция получения конструктора для получения указателя void плюс дополнительной переменной, чтобы сообщить ему, что он отправляется, так что он может затем преобразовать указатель void в QLocalSocket или QTcpSocket, но я чувствую себя некомфортно, прибегая к reinterpret_castна то, что выглядит так, как будто это должен быть простой бит полиморфизма C ++.
С уважением,
Stephen.