2013-10-23 90 views
1

我將通過示例更好地形成問題。從指向基礎對象的指針初始化派生對象

我想延長Qtcpsocket的defult執行方式如下:

class NumberedTcpSocket : public QTcpSocket 
{ 
Q_OBJECT 
public: 
    NumberedTcpSocket(QObject *parent=0); 
    int number; 
}; 

我在這裏做的唯一的事情是添加一個int number領域的與QTcpSocket默認實現。我需要這個枚舉打開的套接字。

但是,其餘的網絡類使用,或返回Qtcpsocket。這並不重要,我做的改變很小。

我願做這樣的事情:

NumberedTcpSocket *clientConnection = returnsPointerToQTcpSocket(); 
clientConnection->number = predefined_number; 

什麼樣的鑄造需要在這種情況下做什麼?它是否包含對NumberedTcpSocket的構造函數的更改?

+0

如果確實知道'returnsPointerToQTcpSocket()'返回'NumberedTcpSocket'對象,那麼使用'static_cast '就足夠了。 – vahancho

+0

'returnsPointerToQTcpSocket()'返回一個'* Qtcpsocket'。 – TheMeaningfulEngineer

+0

是的,我明白了,但我的意思是對象的類型,而不是指向該對象的指針的類型。 – vahancho

回答

1

讓我回顧一下,以確保我明白:你想添加一些你自己創建的套接字?或者你想添加一些東西到由Qt創建的套接字?後者是不可能的(Qt只預留了多少QTcpSocket所需的空間,它將在那裏存儲你的附加數字)?

在前一種情況下,您需要動態投射。確保還要檢查結果= 0,看看是否投成功!

NumberedTcpSocket *clientConnection = dynamic_cast<NumberedTcpSocket*> 
    (returnsPointerToQTcpSocket()); 
if (clientConnection) 
{ 
    clientConnection->number = predefined_number; 
} 

但問題是,你爲什麼不已從然後開始創建具有適當數量的插槽中。

一個更強大的解決方案,在這兩種情況下,很可能是有,你存儲每個這個數字,你需要插座地圖:

QMap<QtcpSocket*, int> m_socketNumbers; 
+0

@vahancho從我所知道的關於動態轉換的知識中,他們可以同時執行這兩個操作,但是基類到派生(在指針上)的特例是,當沒有指向派生對象時它們將返回0(請參閱http:// stackoverflow.com/questions/2253168/dynamic-cast-in-c) – codeling

+0

在確定QTcpSocket是一個多態類之後,我接受了我的評論 - 在這種情況下,base-to-derived是有意義的。 – vahancho

2

有什麼理由不從你的問題明確的是,無論你的一個創建套接字對象。如果它是用new NumberedTcpSocket()構建的,則可以使用dynamic_castQTcpSocket進行投射。如果不是,那麼它不是NumberedTcpSocket,它不可能被視爲一個。

另一種方法是,如果您只需將數字與套​​接字相關聯,則可以避免創建子類並使用動態屬性系統。也就是說,您可以使用clientConnection->setProperty("number", predefined_number);來設置該號碼,並使用clientConnection->property("number").toInt();來檢索該號碼。但是,如果沒有更多關於您想要實現的細節的信息,很難提供建議。

+0

'NumberedTcpSocket'永遠不會顯式創建。我只有一個指向'returnsPointerToQTcpSocket()'的'QTcpSocket'的指針。我想將'* QTcpSocket'強制轉換爲'* NumberedTcpSocket'。然後通過投射使所有屬性(由'returnsPointerToQTcpSocket()'初始化和設置)以及'QTcpSocket'中的方法加上'number'屬性。 – TheMeaningfulEngineer

相關問題