2012-01-01 11 views
1

数値ベクトルのクラスを実装しようとしています。私は私を混乱させる事がstatic_castの不思議な動作

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

がまったく動作しないということである

typedef float ArithmeticF; 
typedef QVector<ArithmeticF> VectorFloat; 

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

STLベクトルに類似しているQtのテンプレートQVectorを使用しています。私は行ごとにデバッグしようとしましたが、VectorFloat :: operator < <はまったく呼び出されません。エラーはなく、プログラムはコンパイルされ実行されますが、何もしません。しかし、これは動作します:

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

*thisオブジェクトのコピーを作成し、<<演算子を適用する値型VectorFloatにキャストしています。この一時的なオブジェクトは即座に破壊され、したがって何の効果も観察できませんでした。

代わりに参照VectorFloat&にキャストする必要があります2番目の例では、働くということは簡単に解説できるで

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

。コピーしたオブジェクトを変数aに保存すると、この変更されたコピーに基づいてVectorFが再構築されます。道に沿って多くの操作が行われています(VectorFloatへの変換、VectorFへの変換、*thisへの変換)が実際には機能します。

+0

私は今理解しています!どうもありがとうございました! –

+0

それはあなたのための最も有用なものだった場合は、答えの横にある "ダニ"をクリックすることが慣例です:)いずれにせよ、私は助けることができてうれしい! – Xion

関連する問題