Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение типов 
:(
    Опции темы
shtuceron
Дата 19.6.2011, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 17.2.2008

Репутация: нет
Всего: нет



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

Есть класс 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()));
}


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

Спасибо.
PM MAIL WWW   Вверх
volatile
Дата 19.6.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



В данном случае, имхо, вообще приведение не нужно

Код

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


Добавлено через 3 минуты и 32 секунды
И, кстати, зачем вы возвращаете сам объект?
Не знаю что там у вас за остальной код, но это похоже, неправильное решение..
PM MAIL   Вверх
bsa
Дата 19.6.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 17.2.2008

Репутация: нет
Всего: нет



volatile, вы совершенно правы.

Цитата

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


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


Это сообщение отредактировал(а) shtuceron - 19.6.2011, 21:38
PM MAIL WWW   Вверх
mes
Дата 19.6.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
volatile
Дата 19.6.2011, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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();
и базовый класс так же.

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


PM MAIL   Вверх
afiskon
Дата 20.6.2011, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Цитата

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

А вдруг пользователь вашего класса любит писать myObject.doSomething().doSomethingElse.andDoSomethingMore() ? smile
PM MAIL WWW   Вверх
bsa
Дата 20.6.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

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

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.