2012-01-01 3 views
1

숫자 형 클래스를 구현하려고합니다. 내가 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); 
} 

나를 혼란 것은 유사하다 Qt는 템플릿 QVector을 사용하고하는 것은

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

가 전혀 작동하지 않는다는 것입니다. 줄 단위로 디버깅하려고 시도하고 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&으로 캐스팅해야 두 번째 예는 작동 쉽게 천명 할 것을

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

사실을. 복사 된 개체를 a 변수에 저장하고 있으며이 수정 된 복사본을 기반으로 VectorF을 재구성하고 있습니다. 길을 따라 너무 많은 작업이 수행되고 있습니다 (VectorFloat으로 변환, VectorF으로 다시 변환, *this으로 지정). 실제로는 작동합니다.

+0

이제 알게되었습니다! 고마워요! –

+0

답변이 가장 도움이된다면 답안 옆에있는 "진드기"를 클릭하는 것이 관례입니다 :) 어떤 경우에도 도움이 될 수있어서 기쁩니다! – Xion