Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Приведение типов


Автор: shtuceron 19.6.2011, 20:40
Добрый вечер, сложилось представление о понимании приведения типов в С++, однако как оказалось это не так, поэтому прошу помощи в этом вопросе...

Есть класс Vector и дочерний Vector3, в классе Vector имеестя метод Normalize()
Код

template <class T> Vector<T> Vector<T>::Normalize()
{
    T sumSquare = this->Length();

    for (int i = 0; i < this->_row; i++)
    {
        this->data[i] /= sumSquare;
    }

    return *this;
}


в дочернем классе его переопределяю
Код

template <class T> Vector3<T> Vector3<T>::Normalize()
{
        // Хотелось сделать так
        // return static_cast<Vector3<T>&>(this->Vector<T>::Normalize());
        // однако возникает ошибка: invalid static_cast from type 'Vector<float>' to type 'Vector3<float>&'

        // Работает только эта реализация, однако есть предупреждение: warning: taking address of temporary
        // (Для меня эта ошибка совсем непонятна)
        return = *(static_cast<Vector3<T>*>(&this->Vector<T>::Normalize()));
}


В чем здесь ошибка и как ее исправить.

Спасибо.

Автор: volatile 19.6.2011, 21:04
В данном случае, имхо, вообще приведение не нужно

Код

template <class T> Vector3<T> Vector3<T>::Normalize()
{
   Vector<T>::Normalize();
   return *this;
}


Добавлено через 3 минуты и 32 секунды
И, кстати, зачем вы возвращаете сам объект?
Не знаю что там у вас за остальной код, но это похоже, неправильное решение..

Автор: bsa 19.6.2011, 21:35
shtuceron, когда функция возвращает копию объекта (как в твоем случае, хотя ты запросто мог сделать возврат ссылки на объект), то создается временный объект (в стандарте называется rvalue). На такие объекты накладывается ряд ограничений. Главное из них - объект будет уничтожен после первой операции (упрощенно). Поэтому, обычно, такие объекты тупо присваивают.

Автор: shtuceron 19.6.2011, 21:36
volatile, вы совершенно правы.

Цитата

И, кстати, зачем вы возвращаете сам объект?
Не знаю что там у вас за остальной код, но это похоже, неправильное решение..


остальной код - это по сути операции с векторами, а вы рекомендовали бы возвращать только данные или ссылку на объект, почему не сам объект (ему так же доступны переопределенные операторы)

Автор: mes 19.6.2011, 22:08
Цитата(shtuceron @  19.6.2011,  20:36 Найти цитируемый пост)
, а вы рекомендовали бы возвращать только данные или ссылку на объект, почему не сам объект

сам объект как раз и возвращается по ссылке, а при передаче по значению возвращется копия объекта..

Автор: volatile 19.6.2011, 23:27
shtuceron, mes абсолютно прав. 
Цитата(volatile @  19.6.2011,  21:04 Найти цитируемый пост)
зачем вы возвращаете сам объект?

я не совсем точно выразился, я хотел сказать зачем вы возвращаете копию объекта?

Цитата(shtuceron @  19.6.2011,  21:36 Найти цитируемый пост)
а вы рекомендовали бы возвращать только данные или ссылку на объект

Вообще-то это зависит от того как вы собираетесь использовать Normalize()..
Ближе всего к тому что вы хотели сделать (я становлюсь телепатом!  smile ), это вернуть константную ссылку на объект.
Код

template <class T> 
Vector3<T> const & Vector3<T>::Normalize();
и базовый класс так же.

Впрочем, лично я,  в такой функции, не стал бы возвращать вообще ничего.
Но это дело вкуса...


Автор: afiskon 20.6.2011, 06:45
Цитата

лично я,  в такой функции, не стал бы возвращать вообще ничего.

А вдруг пользователь вашего класса любит писать myObject.doSomething().doSomethingElse.andDoSomethingMore() ? smile

Автор: bsa 20.6.2011, 10:13
Цитата(afiskon @  20.6.2011,  06:45 Найти цитируемый пост)
А вдруг пользователь вашего класса любит писать myObject.doSomething().doSomethingElse.andDoSomethingMore() 

Согласись, это уже его [пользователя] проблемы. Имхо, нет практически никакой разницы, что возвращать. Да, возврат неконстантной ссылки на объект наиболее универсальное решение, но иногда оно может провоцировать на лишнее усложнение кода пользователем. Поэтому, разработчик имеет право отказаться от него в пользу, например, возврата bool или вообще ничего.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)