2012-01-01 3 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

Я понимаю сейчас! Большое спасибо! –

+0

Обычно щелкнуть «галочку» рядом с ответом, если это было наиболее полезно для вас :) В любом случае, рад, что я мог бы помочь! – Xion

Смежные вопросы