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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация объекта pair<T,T> без конструктора T 
V
    Опции темы
archimed7592
Дата 9.12.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(JackYF @  9.12.2007,  20:13 Найти цитируемый пост)
Ты тоже будешь делать downcasting static_cast'ом?

Однозначного ответа на этот вопрос нет. Когда архитектура позволяет, то да. Когда требование к производительности, по постараюсь сделать так, чтобы архитектрура позволяла.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 9.12.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Ну что ж... каждому своё мнение smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 9.12.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(JackYF @  9.12.2007,  20:13 Найти цитируемый пост)
Downcasting сам по себе в плюсах - вещь, использование которой желательно ограничивать...

Почему? И главное - почему именно в плюсах? Я не спорю, что зачастую лучше от него отказаться, но каким-то правилом это делать не стоит smile

Цитата(archimed7592 @  9.12.2007,  19:45 Найти цитируемый пост)
Вообще говоря, dynamic и const пользовался раза 2-3 в жизни

Ну, всё же на мой взгляд динамик нужен достаточно часто. Конст и реинтерпрет - либо изврат, либо врапперы над чисто сишными библиотеками. Хотя, в некоторых случаях, если я уверен в кастинге, конечно, предпочту статик динамику - в силу перформанса. Хотя, если честно, чаще использую qobject_cast, чем динамик (это, конечно, не одно и то же, но динамик в чистом виде мне редко нужен)  smile 

Цитата(archimed7592 @  9.12.2007,  19:45 Найти цитируемый пост)
 а вот dynamic_cast'ом - ИМХО, нужно переписывать

Всмысле перписывать? На что? Или перепроектировать? smile

Цитата(UnrealMan @  9.12.2007,  17:54 Найти цитируемый пост)
сравнение dynamic_cast vs static_cast.

Ну, вообще, по-моему вначале речь шла про:
1. Равны ли c-cast b functional cast.
2. Нужны ли они.
smile



--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 10.12.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Любитель @  9.12.2007,  22:04 Найти цитируемый пост)
что зачастую лучше от него отказаться

Ну вот и я об этом. Каждый отказ - лишний кирпич в фундамент безопасности программы.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Random13
Дата 10.12.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(archimed7592 @ 9.12.2007,  16:22)
Очень хорошо объяснил bsa - советую прочитать. А ещё лучше прочитать указанную им книгу.

Может вопрос не в тему, но раз упомянули - данную книгу нашел, нужно самообразовываться  smile . Но там написано, что - это вторая книга - продолжение книги  "Решение сложных задач C++" Эту книгу на русском что-то найти никак не могу. Может у кого есть ссылка. Нашел только на английском.
тут

Это сообщение отредактировал(а) Random13 - 10.12.2007, 01:34
PM MAIL   Вверх
Lazin
Дата 10.12.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
Цитата(archimed7592 @  9.12.2007,  08:38 Найти цитируемый пост)
а можно пример, где получится мусор при приведении вниз по иерархии? 

пожалуйста:

Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
Код

int main()
{
        A* pa = new A;
        C* pc = (C*)pa;
        pc->h();
        return 0;
}


Цитата(JackYF @  9.12.2007,  11:13 Найти цитируемый пост)
В результате выводится значения совсем левых мест памяти, а не C::c1, C::c2, что логично следует данного кода.

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

class A {....};
class B {....};
class C : public A, public B {....};
// так что этот код абсолютно нормален
C* pc = new C;
A* pa = (A*)pc;
B* pb = (B*)pb;

Причем указатели pa и pb будут естественно указывать на разные области памяти
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 10.12.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Я и сейчас в недоумении, почему ему разрешено это делать

Я уже сказал - скорость выполнения.

Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Как можно точно сделать UB?..

Есть много способов smile

Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Знаешь, если в программе downcasting выполняется хоть сколько-либо значимое время, то, имхо, прогу давно пора переписывать.

Это совсем не очевидное следствие.

Цитата(JackYF @  9.12.2007,  19:39 Найти цитируемый пост)
Возможность того, что в результате преобразования я получу мусор, сводит на нет все теоретические скоростные показатели такого преобразования.

Вопрос: откуда исходит эта возможность? Хочешь, я тебе сейчас докажу, что передавать аргумент по ссылке в функцию push_back вектора неправильно?

Рассмотрим пример

Код

std::vector<int> vec;
...
if (vec.size())
    vec.push_back(vec.back());

Здесь мы тоже можем получить мусор. Ошибка не очевидная - в глаза не бросается, нужно вдаваться в детали работы вектора, чтобы понять её суть и причину. Если бы передача аргумента была по значению, то никакой проблемы не было бы.

Цитата(Любитель @  9.12.2007,  22:04 Найти цитируемый пост)
Конст и реинтерпрет - либо изврат, либо врапперы над чисто сишными библиотеками.

Опять 25. const_cast может применяться для избежания дублирования кода, reinterpret_cast - для преобразований
char * <--> unsigned char *. И это только примеры, которые сразу вспоминаются.

Цитата(Любитель @  9.12.2007,  22:04 Найти цитируемый пост)
Ну, вообще, по-моему вначале речь шла про:
1. Равны ли c-cast b functional cast.
2. Нужны ли они.

Разговор про dynamic_cast завёл не я, а JackYF. Зачем - это вы у него спросите smile

Цитата(Lazin @  10.12.2007,  09:24 Найти цитируемый пост)
В твоем приведении типа выполняется приведение вверх по иерархии, а не вниз, а это делать можно только если ты точно знаешь тип объекта, который приводишь.
А вниз по иерархии(от производного к базовому) можно приводить в любом случае.

У тебя какая-то нетрадиционная терминология. Обычно принято считать, что дерево классов растёт сверху вниз.


Это сообщение отредактировал(а) UnrealMan - 10.12.2007, 11:25
PM MAIL   Вверх
Lazin
Дата 10.12.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
У тебя какая-то нетрадиционная терминология. Обычно принято считать, что дерево классов растёт сверху вниз.

Надо-же я всегда себе деревья по другому представлял, для меня вниз по иерархии(downcasting) - это от производного к базовому, в этом случае противоречия нет...
А где вы встречали такую терминологию?
И кстати причем здесь dynamic_cast? Вот всегда так бывает, начинается все с одной темы, потом обсуждение заходит неизвестно куда))
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 10.12.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lazin @  10.12.2007,  12:02 Найти цитируемый пост)
для меня вниз по иерархии(downcasting) - это от производного к базовому

http://en.wikipedia.org/wiki/Downcasting

Цитата(Lazin @  10.12.2007,  12:02 Найти цитируемый пост)
А где вы встречали такую терминологию?

В литературе smile Какой конкретно не помню.


PM MAIL   Вверх
Random13
Дата 10.12.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Lazin @ 10.12.2007,  12:02)
А где вы встречали такую терминологию?

Я встречал в UML диаграммах.
Но по-моему в аппкастинге тоже могут быть проблемы в случае множественного наследования. Там как-то делается уже подзабыл, чтобы вместо общего 2 раза повторяющегося родителя стоял на него поинтер - тогда проблем не будет.

Это сообщение отредактировал(а) Random13 - 10.12.2007, 15:23
PM MAIL   Вверх
JackYF
Дата 10.12.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Lazin @  10.12.2007,  09:24 Найти цитируемый пост)
В твоем приведении типа выполняется приведение вверх по иерархии, а не вниз

наоборот. Вниз по иерархии - от базового к наследнику.

Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
Я уже сказал - скорость выполнения.

Я принял этот аргумент.

Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
Это совсем не очевидное следствие.

Хорошо. Добавляю "имхо". Для меня это почти очевидно.

Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
Разговор про dynamic_cast завёл не я, а JackYF. Зачем - это вы у него спросите

Как частный случай С-каст vs С++-каст.

Цитата(Lazin @  10.12.2007,  12:02 Найти цитируемый пост)
И кстати причем здесь dynamic_cast?

придётся тебе читать тему сначала  smile 



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 10.12.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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




M
archimed7592
Да, уж, от темы то мы "малость" отошли :).


Цитата(UnrealMan @  10.12.2007,  11:18 Найти цитируемый пост)
const_cast может применяться для избежания дублирования кода, reinterpret_cast - для преобразований

С конст-кастом не поспоришь, но, как у const_cast'а, так и у copy-paste есть как плюсы, так и минусы.
Ну а reinterpret - я понимаю, что я обманываю сам себя, но делаю я это посредством двойного статик-каста(где встретил такой способ точно не помню, но там как-то хитро объяснялось, что это гут smile).

Это сообщение отредактировал(а) archimed7592 - 10.12.2007, 17:41


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 10.12.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @  10.12.2007,  17:41 Найти цитируемый пост)
но делаю я это посредством двойного статик-каста

А почему бы сразу 10 static_cast-ов не вставить? Любое преобразование указателя к указателю через reinterpret_cast можно заменить двумя преобразованиями static_cast

cv T1 * → cv void * → cv T2 *

но наглядности это коду не прибавит, как хитро ни объясняй.



Это сообщение отредактировал(а) UnrealMan - 10.12.2007, 19:30
PM MAIL   Вверх
zkv
Дата 10.12.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(archimed7592 @  10.12.2007,  17:41 Найти цитируемый пост)
где встретил такой способ точно не помню, но там как-то хитро объяснялось, что это гут

тут говорится
PM MAIL   Вверх
archimed7592
Дата 11.12.2007, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



zkv, точно smile. Спасибо, а я забыл про этот ресурс... как раз почитаю чего новенького есть.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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