2016-06-18 69 views
2

我用C++中的QtFramework開發。我遇到了這種轉換方法,即static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error)。但我不明白這是什麼意思?這個轉換是什麼意思?

回答

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

其中:

&QAbstractSocket::error - 被命名爲error(...)函數的地址;

它將它轉換爲void (QTcpSocket::*)(QAbstractSocket::SocketError) - 這是一個指向QTcpSocket函數的成員的指針,該成員使用參數QAbstractSocket::SocketError並返回void

所以我們從QAbstractSocket(也許是基類)成員函數的地址轉換爲QTcpSocket(也許是派生類)成員的函數指針。

注意

由於talamaki解釋真的很好這樣做的原因(即在一個連接選擇正確的函數(...);另一種方法是使用舊版本的Qt的連接()的風格,你可以明確地選擇正確的函數,但是如果你弄錯了代碼就會丟失編譯器時間的錯誤,我經常認爲這個問題更加清楚(例如,這個問題可能不需要問),下面是一個例子:

// 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 inherits來自基類QAbstractSocket。有一種方法SocketError error()QAbstractSocket中的信號void error(QAbstractSocket::SocketError socketError),即具有相同的名稱。

在存在重載的情況下,函數名稱的地址本身是不明確的。您可以使用static_cast<>()根據函數指針類型所隱含的函數簽名來指定要使用的函數。

由於void (QTcpSocket::*)(QAbstractSocket::SocketError)是一個指向QTcpSocket函數類型的指針,它返回void並採用參數QAbstractSocket::SocketError,因此您的問題中的投射會選擇該信號。

例如,要使用函數指針語法連接到QAbstractSocket::error信號,必須在靜態轉換中指定信號類型。

+0

說得好,先生。 +1也指出了可能會這樣做的原因,這也導致我在我的答案中增加一個註釋(作爲一種潛在的選擇) –