2016-06-18 18 views
2

Ich entwickle mit QtFramework in C++. Ich stieß auf diese Konvertierungsmethode, die static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error) ist. Aber ich habe nicht verstanden, was es bedeutet?Was bedeutet das konvertieren?

Antwort

1
static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error) 

wo:

&QAbstractSocket::error - ist die Adresse der Funktion error(...) genannt;

Und es wirft es auf void (QTcpSocket::*)(QAbstractSocket::SocketError) - das ist ein Zeiger auf eine Mitglied (von QTcpSocket) -Funktion, die einen Parameter QAbstractSocket::SocketError und void zurückgibt.

Wir übertragen also von der Adresse einer Funktion, die ein Mitglied von QAbstractSocket ist (vielleicht eine Basisklasse), zu einem Funktionszeiger, der ein Mitglied von QTcpSocket ist (vielleicht die abgeleitete Klasse).

Hinweis

Als talamaki wirklich schön den Grund dafür erklärt (dh die korrekte Funktion während eines connect (...) zu wählen; Eine Alternative ist die ältere Qt connect() Stil zu verwenden, die Sie kann die richtige Funktion auf Kosten der Verlierer Compiler-Zeit Fehler wählen, wenn Sie es falsch verstehen.Ich denke oft, dass dies klarer ist (zum Beispiel diese Frage würde wahrscheinlich nicht gefragt werden). Hier ist ein Beispiel:

// Here we can explicitly choose the correct function, 
// and its clear to any reader what is going on. 
connect(pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), 
     this,  SLOT(errorHandler(QAbstractSocket::SocketError))); 
2

QTcpSocket erbt aus der Basisklasse QAbstractSocket. Es gibt ein Verfahren SocketError error() und ein Signal void error(QAbstractSocket::SocketError socketError) in QAbstractSocket, d.h. mit dem gleichen Namen.

Bei Überlastungen ist die Adresse des Namens der Funktion an sich mehrdeutig. Sie können static_cast<>() verwenden, um anzugeben, welche Funktion gemäß der Funktionssignatur verwendet werden soll, die vom Funktionszeigertyp impliziert wird.

Der Cast in Ihrer Frage wählt das Signal aus, weil ein Zeiger auf einen Funktionstyp in QTcpSocket ist, der void zurückgibt und einen Parameter QAbstractSocket::SocketError übernimmt.

Um beispielsweise mit der Syntax des Funktionszeigers eine Verbindung zum Signal QAbstractSocket::error herzustellen, müssen Sie den Signaltyp in einer statischen Darstellung angeben.

+0

Gut gesagt, mein Herr. +1 für den Hinweis, warum man das auch tun könnte, was mich auch dazu bringt, meiner Antwort eine Notiz hinzuzufügen (als mögliche Alternative) –