野心的すぎるかもしれませんが、QLocalSockets と QTcpSockets の両方で接続を受け入れることができるサーバー プログラムを作成しようとしています。概念は、新しい接続をリッスンする QLocalServer と QTcpServer の両方を持つ「nexus」オブジェクトを持つことです。
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++ ポリモーフィズムの簡単なビットのはずです。
よろしく、
スティーブン。