2012-01-01 46 views
1

我想實現一類數字向量。我使用Qt模板QVector這類似於STL矢量static_cast的神祕行爲

typedef float ArithmeticF; 
typedef QVector<ArithmeticF> VectorFloat; 

class VectorF : public VectorFloat 
{ 
/// appends the rightSide to the end 
VectorF& operator << (const VectorF& rightSide); 
} 

,混淆我的事情是,

VectorF& VectorF::operator << (const VectorF& rightSide) 
{ 
static_cast<VectorFloat>(*this) << static_cast<VectorFloat>(rightSide); 
return *this; 
} 

不會在所有的工作。我試圖逐行調試它,並且VectorFloat ::運算符< <根本不會被調用。沒有錯誤,程序編譯並運行,但什麼都不做。然而這個作品:

VectorF& VectorF::operator << (const VectorF& rightSide) 
{ 
VectorFloat a = static_cast<VectorFloat>(*this); 
VectorFloat b = static_cast<VectorFloat>(rightSide); 
a << b; 
*this = VectorF(a); 
return *this; 
} 

我只是好奇它爲什麼如此。我試圖深入static_cast命令,但我無法弄清楚。

請幫幫我。

回答

2

您正在轉換爲值類型VectorFloat,該值類型爲*this對象的副本,並將<<運算符應用於該值。這個臨時對象被及時銷燬,因此沒有任何效果可以被觀察到。

你應該投給參考VectorFloat&代替:

static_cast<VectorFloat&>(*this) << static_cast<VectorFloat>(rightSide); 

是第二個例子的工作原理是很容易得到解釋的事實。您正在將複製的對象存儲在a變量中,並且您正在根據此修改後的副本重建您的VectorF。沿途有太多的操作正在進行(轉換爲VectorFloat,轉換回VectorF,分配到*this),但在實際中它是有效的。

+0

我明白了!非常感謝你! – 2012-01-01 10:55:33

+0

習慣上點擊回答旁邊的「打勾」,如果它對你最有幫助的話:)無論如何,很高興我能幫上忙! – Xion 2012-01-01 10:57:36