Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 20:07 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Какой-то сумасшедший код :) Вернуть ссылку на указатель созданного объекта и реинтерпрет-кастом перекастить предка в наследника, при этом потеряв укаатель на созданный объект B - это круто :) Явно вы не этого хотели, т.к. любое обращение к членам данным класса B вызовет ошибку. Так что ли? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 20:45 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumix Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit) Помоему тут вобще все нужно менять :) ИМХО лыжи в этой конструкции : b() = (B*) new A; // как этот кастинг спрятать в класс не поедут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 20:54 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
фабрика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 20:57 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
ДохтаР ИМХО лыжи в этой конструкции : b() = (B*) new A; // как этот кастинг спрятать в класс не поедут Не знаю, что имеется ввиду, но приведенный выше пример отлично компилится и работает!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 21:11 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастомВернуть ссылку на указатель созданного объекта и реинтерпрет-кастом перекастить предка в наследника, при этом потеряв укаатель на созданный объект B - это круто :) С этой проблемой лучшие умы форума помогают мне справится в соседней 13611210 теме. ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 21:15 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастомЯвно вы не этого хотели, т.к. любое обращение к членам данным класса B вызовет ошибку. Вообще-то именно это-го я и хотел: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. насчет того, что это не будет работать и вызовет ошибку... щас проверю... *b() не вариант, для пользователей это слишком трудно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 21:20 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастом Так что ли? Код: plaintext 1. 2. Нет, в момент b() = new A ваш оператор не вызывается вообще! operator A() {} тоже не вызывается похоже, что в данном случае я ищу что-то типа Код: plaintext 1. потому что мы же не можем написать так Код: plaintext 1. ведь мы не знаем всех имен наследников... а если и узнаем, то заколебемся перечислять... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 21:30 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumix(B*) new A; Не знаю, что имеется ввиду, но приведенный выше пример отлично компилится и работает!! Ну и код который читает/пишет в случайный адрес памяти тоже откомпилируется и тоже может работать без видимых ошибок. Но это не значит что он корректный. А приведение предка к наследнику и работа с ним как с наследником - это по уровню безумия прямой аналог такого кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 21:31 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixреинтерпрет-кастомВернуть ссылку на указатель созданного объекта и реинтерпрет-кастом перекастить предка в наследника, при этом потеряв укаатель на созданный объект B - это круто :) С этой проблемой лучшие умы форума помогают мне справится в соседней 13611210 теме. ))) Они там глумятся и не понимают чего вы хотите :) А проблемы у вас тут 2: 1. ссылка большого типа на объект маленького типа (наследника на предка) - выход за границы объекта это Undefined Behavior 2. потеря значения указателя на new B - утечка памяти это Memory Leak В общем будет увеличиваться размер программы и выскакивать исключения, насколько часто - зависит от контекста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 21:32 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixреинтерпрет-кастомТак что ли? Код: plaintext 1. 2. Нет, в момент b() = new A ваш оператор не вызывается вообще! operator A() {} тоже не вызывается похоже, что в данном случае я ищу что-то типа Код: plaintext 1. потому что мы же не можем написать так Код: plaintext 1. ведь мы не знаем всех имен наследников... а если и узнаем, то заколебемся перечислять... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. выводoperator= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 21:34 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНу и код который читает/пишет в случайный адрес памяти тоже откомпилируется и тоже может работать без видимых ошибок. Мы ведь не пишем в случайный адрес, потому что функция b() дает нам указатель через ссылку. Случайная запись была бы если бы мы писали в указатель, который нам вернула функция, то есть она вернула бы нам копию указателя, а не сам указатель. А тут вроде все чисто... поправьте если я что-то упустил... Anatoly MoskovskyА приведение предка к наследнику и работа с ним как с наследником - это по уровню безумия прямой аналог такого кода. В нашем случае архитектура системы гарантирует, что c b() будут работать как с А. Другой вопрос, если вы намекаете, что сишный кастинг не достраивает объект вверх, а только копирует предка в начало памяти под объект наследника, а оставшийся кусок просто берется из случайных данных в памяти, тогда да, риски возрастают... но и соответственно возникает вопрос: как организовать кастинг А с автоматической достройкой до дефолтного объекта B в той части, в которой B превышает А?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 22:23 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастом Они там глумятся и не понимают чего вы хотите :) Ну глумятся, ну и что... ))) а на каком форуме не глумятся?? ))) главное, что задача успешна решена. Некий доктор помог...))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 22:25 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастом А проблемы у вас тут 2: 1. ссылка большого типа на объект маленького типа (наследника на предка) - выход за границы объекта это Undefined Behavior 2. потеря значения указателя на new B - утечка памяти это Memory Leak В общем будет увеличиваться размер программы и выскакивать исключения, насколько часто - зависит от контекста. Вторая проблема уже решена в той самой глумливой ветке. Мы просто прошьем в базовый класс автоудаление. А вот насчет первого пункта... У вас есть идеи как автоматом достраивать этот кусок "надстроку" до неких дефолтных значений предка?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 22:28 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастомвыводoperator= да, подтверждаю, что работает, но два 2 но: 1. как-то звездочку надо спрятать *b() = 2. а тут /* ... */ вы случайно не на ручное почленное копирование намекаете??? если да, то это не вариант, они никто этого делать не будут, они тогда будут сишно кастить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 22:34 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixпоправьте если я что-то упустил... Вы упустили ключевую концепцию языка С++ в третем сообшении топика ссылка про лыжи . Почитайте внимательно , посмотрите примеры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 23:23 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixДохтаРИМХО лыжи в этой конструкции : b() = (B*) new A; // как этот кастинг спрятать в класс не поедут Не знаю, что имеется ввиду, но приведенный выше пример отлично компилится и работает!! процитируйте пункт из ссылки что вы всетаки имели ввиду написав b() = И какое поведение вы ожидаете от компилятора в этом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2012, 23:44 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixреинтерпрет-кастомпропущено... да, подтверждаю, что работает, но два 2 но: 1. как-то звездочку надо спрятать *b() = 2. а тут /* ... */ вы случайно не на ручное почленное копирование намекаете??? если да, то это не вариант, они никто этого делать не будут, они тогда будут сишно кастить... Я ни на что не намекаю, так как абсолютно не понятно что нужно :) В большинстве случаев можно поспорить насчет извратов, но в данном случае 100% планировалось что-то другое. Может это? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 00:51 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
ДохтаРLumix Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit) Помоему тут вобще все нужно менять :) ИМХО лыжи в этой конструкции : b() = (B*) new A; // как этот кастинг спрятать в класс не поедут Здесь как раз lvalue-rvalue проблемы нет, проблемы 2, о которых я писал выше. У автора заблуждений и без вас хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 01:20 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumix Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Все знают, что существует перегрузка кастинг оператора (). Подскажите как в этом случае можно заменить явный кастинг (explicit) на неявный (implicit) Никак. Перегрузка существует у класса, а это не класс, а указатель на него. К тому же каст не верный, заведомо левый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 09:53 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
ДохтаРпроцитируйте пункт из ссылки что вы всетаки имели ввиду написав b() = Не совсем понял какую цитату вы от меня ждете. Я далек от академических кругов... я сугубо практик... [quot ДохтаР]Lumixпропущено...И какое поведение вы ожидаете от компилятора в этом случае. странный вопрос... ведь я начал тему с полностью рабочего примера, который 100% делает то, что я от него хочу хотя конечно для протокола я могу и явно объявить свои намерения я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore сейчас с этой задачей справляется строчка b() = (B*) new A; и стоит задача спрятать кастинг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 16:49 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастомЯ ни на что не намекаю, так как абсолютно не понятно что нужно :) я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore сейчас с этой задачей справляется строчка b() = (B*) new A; и стоит задача спрятать кастинг реинтерпрет-кастомВ большинстве случаев можно поспорить насчет извратов, но в данном случае 100% планировалось что-то другое. Может это? 100% нет что планировалось, то и было реализовано в 100% рабочем примере в самом верху стоит лишь задача спрятать каст ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 16:53 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
MasterZivНикак. Перегрузка существует у класса, а это не класс, а указатель на него. ок понял видимо поэтому РК пошел по пути *b() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 16:55 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumix я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore сейчас с этой задачей справляется строчка b() = (B*) new A;нет, не справляется. в этой строчке - ошибка, и она со всей серьёзностью проявит себя как только класс B начнёт содержать поля, которых нет в родителе. С большой долей вероятности ошибка будет проявляться в самых неожиданных частях программы, казалось бы, никак не связанных с написанным здесь кодом Lumixстоит лишь задача спрятать каста целью этой задачи стоит максимально затруднить отладку себе и окружающим, так? Всем, всем, всем: надеюсь вы понимаете, что своими советами вы рождаете чудовище? Он ведь библиотечный код пишет, кому-то ведь достанется _это_ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 17:10 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастом Код: plaintext 1. 2. кстати, а зачем тут ссылка?? ведь вроде shared для того и придумали, чтобы их можно было кидать через копии на границах между функциями... вроде ссылка нужна если бы вы построили решение на обычных умных указателях... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 17:20 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
egorychLumix я хочу чтобы строчка b() = new A; помещала адрес этого объекта в указатель globalStore сейчас с этой задачей справляется строчка b() = (B*) new A;нет, не справляется. в этой строчке - ошибка, и она со всей серьёзностью проявит себя как только класс B начнёт содержать поля, которых нет в родителе. С большой долей вероятности ошибка будет проявляться в самых неожиданных частях программы, казалось бы, никак не связанных с написанным здесь кодом Можете сформулировать конкретную модель угрозы, если я утверждаю, что в этом случае b() будет 100% использоваться только по А фейсу?? то есть только в условиях типа Код: plaintext 1. 2. 3. вот такое 100% исключено Код: plaintext 1. 2. 3. egorych Всем, всем, всем: надеюсь вы понимаете, что своими советами вы рождаете чудовище? Он ведь библиотечный код пишет, кому-то ведь достанется _это_ Я наоборот о людях забочусь!! чтобы им было комфортнее работать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 17:27 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixМожете сформулировать конкретную модель угрозы, если я утверждаю, что в этом случае b() будет 100% использоваться только по А фейсу?? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. например LumixЯ наоборот о людях забочусь!! чтобы им было комфортнее работать...бессонные ночи в отладке чужого кода, на мой взгляд, не то, что можно было назвать комфортом в работе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 17:47 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixя утверждаю, что в этом случае b() будет 100% использоваться только по А фейсу??задлянафига тогда и globalStore, и b() возвращают B*??? вырази свою мысль прямо и точно: Код: plaintext 1. 2. всё, все проблемы решены, клиенты твоей библиотеки не сидят ночами в поисках причин падения безобидного кода, всем бабушкам выплатили пенсию, а ты сидишь счастливый на пляже в обнимку с красивой девушкой и попиваешь молочный коктейль через трубочку. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 17:59 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
egorychнапример я так и не понял ничего про угрозу, потому что ваш пример у меня отлично компилится и работает как надо на что вы намекали я так и не понял... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. egorychбессонные ночи в отладке чужого кода, на мой взгляд, не то, что можно было назвать комфортом в работе. что-то я не припомню, чтобы кому-то приходилось заниматься отладкой кода, который я сдал в боевое использование...наоборот всем нравится, что благодаря моим решениям можно забыть про всякие штуки дрюки с плюсами и сосредоточится на самой программе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 18:52 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
забыл в примере: если первой строчкой вставить b()->print(); то пишет В то есть тоже все круто работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 18:54 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
egorychзадлянафига тогда и globalStore, и b() возвращают B*??? вырази свою мысль прямо и точно: Код: plaintext 1. 2. потому что №1 Код: plaintext 1. 2. 3. 4. потому что №2 Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 19:00 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixвот такое 100% исключено Код: plaintext 1. 2. 3. Скажите, пожалуйста, каким образом вы гарантируете выполнение этого требования? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 23:53 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
MozokСкажите, пожалуйста, каким образом вы гарантируете выполнение этого требования? Ну как же - строгая гарантия методом "на все воля божия" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 00:04 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixреинтерпрет-кастом Код: plaintext 1. 2. кстати, а зачем тут ссылка?? ведь вроде shared для того и придумали, чтобы их можно было кидать через копии на границах между функциями... вроде ссылка нужна если бы вы построили решение на обычных умных указателях... Смотрите в этом случае: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А в этом случае, без &: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Позапускайте этот код с & и без: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 01:10 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Поправка :) А в этом случае, без &: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 01:11 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
egorych Всем, всем, всем: надеюсь вы понимаете, что своими советами вы рождаете чудовище? Он ведь библиотечный код пишет, кому-то ведь достанется _это_ А как название этой библиотеки? Врага нужно знать в лицо! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 01:12 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастомПозапускайте этот код с & и без: [/src] про ссылку понятно, спасибо теперь я кажется понял, что имел ввиду MasterZiv в соседней ветке 13622566 но в примере вы каким-то образом изменили условия задачи и движетесь в каком-то своем направлении, а именно: у вас shared_ptr<A>, а в задаче надо shared_ptr<B> вот полностью рабочий пример Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 11:52 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Пока решение с оператором равно не найдено, запасным вариантом является вот это решение но в нем динамик кастинг не работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 15:57 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixegorychзадлянафига тогда и globalStore, и b() возвращают B*??? вырази свою мысль прямо и точно: Код: plaintext 1. 2. потому что №1 Код: plaintext 1. 2. 3. 4. потому что №2 Код: plaintext 1. а во, нашлось ))) не вижу, чем "потому что №1" и "потому что №2" мешает сделать globalStorage указателем на A. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 16:01 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
egorychLumixпропущено... потому что №1 Код: plaintext 1. 2. 3. 4. потому что №2 Код: plaintext 1. а во, нашлось ))) не вижу, чем "потому что №1" и "потому что №2" мешает сделать globalStorage указателем на A. в event2() могут быть обращения c b() как с B разумеется внутри usage() гарантируется, что B будет использоваться только как А но принимая во внимание пример, который вы привели тут 13626522 я понимаю, что b() = new A невозможно осуществить в принципе по причинам изложенным в моем выводе вот тут 13627171 пока что я в печали, но потом когда я приободрюсь и полученная инфа уложится в голове, возможно, я пойду по пути что-то типа: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 16:44 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixПока решение с оператором равно не найдено, запасным вариантом является вот это решение но в нем динамик кастинг не работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. так чисто для истории, если кому-то эта тема в поиск попадется: с динамик кастингом получился облом детали смотрите тут 13627171 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 16:46 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixв event2() могут быть обращения c b() как с Bа вот тут как раз тебе поможет dynamic_cast: Код: plaintext 1. 2. 3. 4. а чтобы быть уверенным, что класс A можно использовать в качестве базового, оберни его в переходник, и от него уже наследуй свои замечательные другие классы Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. что-то вроде этого, на правах сырой идеи, а не конечной реализации, потому что работать надо через смарт-указатели, и т.д., и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 18:03 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumix, я искренне надеюсь, что ты еще студент, а не работаешь и твой код не идет в продакшон! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 18:29 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
egorychLumixв event2() могут быть обращения c b() как с Bа вот тут как раз тебе поможет dynamic_cast: Код: plaintext 1. 2. 3. 4. а зачем, если у нас b() это 100% гарантия, что там B, ведь кастинг A => B оказался невозможен, причем именно благодаря вашим объяснениям!! если код требует if( dynamic_cast< B* >( b() ) ) { это значит я плохо справляюсь со своей работой и зря ем свой хлеб))) egorychа чтобы быть уверенным, что класс A можно использовать в качестве базового, оберни его в переходник, и от него уже наследуй свои замечательные другие классы Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. что-то вроде этого, на правах сырой идеи, а не конечной реализации, потому что работать надо через смарт-указатели, и т.д., и т.п. я понимаю, что это возможно технически, но никто этого делать не станет тупо по экономическим и временнЫм причинам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 18:38 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
kosh the bestLumix, я искренне надеюсь, что ты еще студент, а не работаешь и твой код не идет в продакшон! я не стану вас разочаровывать, но правда наверное вам не понравится )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 18:39 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
egorychLumixв event2() могут быть обращения c b() как с Bа вот тут как раз тебе поможет dynamic_cast: Код: plaintext 1. 2. 3. 4. я обдумал эту идею A* b() это невозможно в принципе с сигнатурной точки зрения, потому что в голове пользователей уже сидит правило, что A* a(); B* b(); но то, что вы предложили это по нашим правилам можно оформить так Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 22:13 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumix Код: plaintext 1. 2. Это шутка такая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 23:29 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
MozokLumix Код: plaintext 1. 2. Это шутка такая? Это пожалуй лучшая строчка из всего кода автора. Соптимизируется до: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2012, 23:45 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
> я не стану вас разочаровывать, но правда наверное вам не понравится )))) о боже! просто напиши все это на си так будет лучше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 12:03 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
kosh the best, +1 меня тоже всегда поражали выкрутасы в С++ когда формально задача на уровне постановки уже давно могла быть решена с использованием банальных процедуральных каллбеков. И API бы выглядел от этого только чище. И все проблемы С++ по большей части надуманны теми кто пишет код и сам себе Буратино. Не пишите так и проблем не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 12:47 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
kosh the best> я не стану вас разочаровывать, но правда наверное вам не понравится )))) о боже! просто напиши все это на си так будет лучше я как бы обеими руками за, но если бы вы хоть как-то намекнули как именно.... если вы имеете ввиду что-то типа Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Если вы про это, то скорее всего на строчке memcpy() нас ждет великий облом, если A содержит в себе датамеберы через указатели типа class A { int* a;}; но если вы подскажете, где взять супер функцию типа deep_memcpy() или true_memcpy() тогда было бы круто!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:06 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Для начала с головой будет достаточно перестать превращать с++ в js. 1. Вы тратите много времени на борьбу с собственноручно созданными мельницами. 2. Результат все-равно на js не похож и не будет. Т.е. не достигнут. А путаница, которая будет мешать вашим "пользователям" достигнута. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:13 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumix, этот вопрос вообще решают не в плоскости языка а в плоскости алгоритмов и структур данных. Если у тебя есть такая структура как дерево и тебе надо сделать копию поддерева то делай фукцию copy_subtree(..) и копируй. Не вешай на С++ обязательства которые к ЯП не имеют отношения. Это неоправданное (и опасное) усложнение парадигмы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:17 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
О том, что вы задачу в двух топиках лаконично и понятно описать не можете - я уж вообще молчу. Вместо описания того, что вам РЕАЛЬНО надо, вы придумываете несуществующие примеры того, что вам не надо, а через 3 страницы бз всяких угрызений совести сообщаете "а, то я так, для примера привел... мы такое не юзаем, конечно". А нафига ж тогда 3 страницы обсуждали то, что вы не юзаете - не понятно. Так что, ничему не удивляйтесь, когда обсуждается кот в мешке, а общественности то хвост покажут, то шнурки (а кот тут при чем? да ни при чем - так для примеру). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:17 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
maytonЭто неоправданное (и опасное) усложнение парадигмы. Вполне возможно, что он просто пытается создать фрейморк, аля js-овских ассоциативных массивов-объектов. Если так, то Дельфи или C# позволили бы ему достичь большей "похожести" с js. А так - разрыв шаблона из-за ярого нежелания использовать нормальные классы с нормальными методами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:23 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.DragonДля начала с головой будет достаточно перестать превращать с++ в js. Знаете, в свое время я понял, что очень опасно приводить реальные примеры кода, потому что вместо помощи их станут обсирать чисто ради поднятия ЧСВ. И я стал выкладывать малюсенькие примеры. А теперь я вижу, что совершил грубейшую ошибку, упомянув как метафору js в одном из доводов и теперь весь форум думает, что я хочу превратить c++ в js и теперь каждый хочет мне сообщить, что с++ это не js. После этого случая я теперь и метафоры перестану использовать!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:47 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.Dragon2. Результат все-равно на js не похож и не будет. Т.е. не достигнут. А путаница, которая будет мешать вашим "пользователям" достигнута. Вот я ещё раз эксплиситно всем сообщаю: я не пишу js на C++!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:48 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.DragonВполне возможно, что он просто пытается создать фрейморк, аля js-овских ассоциативных массивов-объектов. Если так, то .... ))))) это уже становится как: Петровна, слышала, что Медведев завел блох в свитере? Мужики, ну хорош, а...!!)) ну какие нахрен массивы, чё вы придумываете??))) тема совсем о другом я тему-то как назвал: как спрятать кастинг под капот при чем тут массивы??? я фигею.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:53 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixEdd.DragonДля начала с головой будет достаточно перестать превращать с++ в js. Знаете, в свое время я понял, что очень опасно приводить реальные примеры кода, потому что вместо помощи их станут обсирать чисто ради поднятия ЧСВ. И я стал выкладывать малюсенькие примеры. А теперь я вижу, что совершил грубейшую ошибку, упомянув как метафору js в одном из доводов и теперь весь форум думает, что я хочу превратить c++ в js и теперь каждый хочет мне сообщить, что с++ это не js. После этого случая я теперь и метафоры перестану использовать!! А я тебе минуту назад хотел посоветовать про Lua почитать. Так что... проехали уже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 16:55 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
maytonА я тебе минуту назад хотел посоветовать про Lua почитать. Так что... проехали уже? Смотря о чем читать. Вы там оба ведь написали: нафиг вообще на плюсах это городить, сделай управление памятью на си. Я подумал, что речь о memcpy() То есть если вы имеете ввиду взять сорсы луа и там будет функция deep_memcpy() тогда готов ознакомится с вашей идеей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 17:17 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixmaytonА я тебе минуту назад хотел посоветовать про Lua почитать. Так что... проехали уже? Смотря о чем читать. Вы там оба ведь написали: нафиг вообще на плюсах это городить, сделай управление памятью на си. Я подумал, что речь о memcpy() То есть если вы имеете ввиду взять сорсы луа и там будет функция deep_memcpy() тогда готов ознакомится с вашей идеей Парень, в Lua нет вообще 90% тех проблем которые та нарисовал. Это язык с управляемой памятью по принципу GC. Там нет утечек. Там нет наследования. И нет кастингов со срезкой полей или методов. Этот язык - это просто клондайк для тебя. И я тебя нижайше прошу не будоражить форум надуманными проблемами. Ты вовлёк в дискурс специалистов очень высокого класса (это я тебе как старый мембер говорю). Но потом раз... и написал сущую ерунду. Сразу знаешь-ли както разочаровал. Поэтому не злоупотребляй доверием и приходи сюда с интересными вопросами. С теми которых нет в справочниках и предварительно подучив основы. Все неинтересные мы читаем в миллионый раз и не посылаем в ФАК по той причине что на нашем форуме этого FAQ-а (по С++) просто нет. Успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 17:28 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
maytonПарень, в Lua нет вообще 90% тех проблем которые та нарисовал. Не понял фразу... Подставьте вместо Lua другой язык программирования и какой реакции вы от меня ждете? Парень, в C# нет вообще 90% тех проблем которые та нарисовал. Парень, в Java нет вообще 90% тех проблем которые та нарисовал. Парень, в Python нет вообще 90% тех проблем которые та нарисовал. Парень, в Javascript нет вообще 90% тех проблем которые та нарисовал. Или вы думаете, что в нашей команде кто-то станет заниматься биндингом всех с++ классов в подпространство луа?? Задача, которые мы тут обсуждаем касается С++. Причем тут луа-то?? Я и спросил, если в сорсах луа есть что-то, что поможет решить задачу про глубокое копирование, то я посмотрю сорсы, а если нет, то нам луа не нужна как инструмент... мы же не игры пишем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 17:49 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixЗнаете, в свое время я понял, что очень опасно приводить реальные примеры кода Правильно, нужно создать минимальный демонстрационный образец. Без лишнего наполнения. Lumixи теперь весь форум думает, что я хочу превратить c++ в js Дык, развейте домыслы. Сами же оставили пустые пятна для них )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 17:56 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Не надо ничего развивать. Тема подходит к концу и ее пора закрывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 17:58 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixтема совсем о другом я тему-то как назвал: как спрятать кастинг под капот Никак. А та проблема, из которой этот вопрос вырос, вполне возможно решается красиво и элегантно. Как знать. Тоже самое касается и вопроса "как автоматически подчистить". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 17:58 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.DragonLumixЗнаете, в свое время я понял, что очень опасно приводить реальные примеры кода Правильно, нужно создать минимальный демонстрационный образец. Без лишнего наполнения. дык, так я так и делаю, а меня упрекают, что я типа прячу реальный код, в котором решаю задачу Edd.DragonLumixи теперь весь форум думает, что я хочу превратить c++ в js Дык, развейте домыслы. Сами же оставили пустые пятна для них )) Позиция исчерпывающе изложена вот тут 13633846 все остальное домыслы и черновиковые мысли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 18:16 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
maytonНе надо ничего развивать. Тема подходит к концу и ее пора закрывать. Согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 18:17 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.DragonLumixтема совсем о другом я тему-то как назвал: как спрятать кастинг под капот Никак. А та проблема, из которой этот вопрос вырос, вполне возможно решается красиво и элегантно. Как знать. Тоже самое касается и вопроса "как автоматически подчистить". Решение с кастирующим аксессором обладает 100% элегантностью для нашего кодстайла. Код: plaintext 1. 2. 3. Такой подкапот 100% подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 18:20 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixEdd.Dragonпропущено... Никак. А та проблема, из которой этот вопрос вырос, вполне возможно решается красиво и элегантно. Как знать. Тоже самое касается и вопроса "как автоматически подчистить". Решение с кастирующим аксессором обладает 100% элегантностью для нашего кодстайла. Код: plaintext 1. 2. 3. Такой подкапот 100% подходит. Вы взяли, как советовал, shared_ptr и тем самым избавились от Memory Leak. Но до сих пор кастите предка в наследника, т.е. вам в вашем модуле надо будет сверху написать предупреждение: Attention! Undefined behavior of the module. И в ChangeLog'e добавить это предупреждение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:05 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixТакой подкапот 100% подходит. Ну вот я спрашивал - кто все это объявляет и когда/где? Внутренности функции b ваши? new A - пишет пользователь? Где чей код? Это так сложно расписать четко и однозначно? Если этот вопрос не осветить, то все считается вашим. Если ваше - то нет вообще необходимости ни в шаредах, ни в подкапоте - вы просто пишете delete там, где ему место и все. Так где появляется необходимость во всем этом, и почему вы не можете удалить самостятельно старый объект при добавлении нового? Неужели невозможное объяснить прошу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:12 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
реинтерпрет-кастомВы взяли, как советовал, shared_ptr и тем самым избавились от Memory Leak. Но до сих пор кастите предка в наследника, т.е. вам в вашем модуле надо будет сверху написать предупреждение: Attention! Undefined behavior of the module. И в ChangeLog'e добавить это предупреждение. Я его не кастю, потому что не знаю как это сделать. см. задачу про кастинг тут 13634956 Конкретно это решение не про кастинг, а про как спрятать под капот. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:47 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixреинтерпрет-кастомВы взяли, как советовал, shared_ptr и тем самым избавились от Memory Leak. Но до сих пор кастите предка в наследника, т.е. вам в вашем модуле надо будет сверху написать предупреждение: Attention! Undefined behavior of the module. И в ChangeLog'e добавить это предупреждение. Я его не кастю, потому что не знаю как это сделать. см. задачу про кастинг тут 13634956 Конкретно это решение не про кастинг, а про как спрятать под капот. Код: plaintext 1. 2. 3. Есть то что вы хотите, а есть реальность - то что происходит. Конкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 21:56 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.DragonНу вот я спрашивал - кто все это объявляет и когда/где? Это объявляет макрос автоматически в месте, где прописывается объект B чисто условно это место можно назвать файл b.h и b.cpp Edd.DragonВнутренности функции b ваши? Наши. Edd.Dragonnew A - пишет пользователь? Где чей код? Это так сложно расписать четко и однозначно? Нет, new вызывает код, который нам недоступен. Он расположен внутри динамических библиотек, которые мы используем as is, у нас есть только заголовочные и *.a файлы мы получаем указатель через некий внешний интерфейс, который я на протяжении этих тем называл вот так Код: plaintext 1. 2. Edd.DragonЕсли этот вопрос не осветить, то все считается вашим. Если ваше - то нет вообще необходимости ни в шаредах, ни в подкапоте - вы просто пишете delete там, где ему место и все. наши пользователи никогда не пишут delete с целью управления объектами. единственное использование delete это схлопывание стадии целиком. в этом смысле delete это всегда некий синоним closeState() Код: plaintext 1. Edd.DragonТак где появляется необходимость во всем этом, и почему вы не можете удалить самостятельно старый объект при добавлении нового? Неужели невозможное объяснить прошу? Потому что пользователям запрещено пользоваться new и delete с целью управления памятью, потому что если им это разрешить, тогда обязательно появятся ошибки из-за невнимательности, а это приведет к падению кода архитектура системы выстроена таким образом, что у каждого класса автоматически создается аксессор если есть класс A всегда есть A* a() если есть класс Jopa, то всегда есть Jopa* jopa() (вернее раньше так было, а сейчас все будет на шарепоинтах, но смысл тот же) раньше можно было вызывать delete a(), а сейчас придется a().reset() раньше a() = new A; работало, но порождало висяк если я что-то упустил, сообщите, я добавлю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:00 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
ну и разумеется из-за чего я вообще пришел на этот форум Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:04 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixПотому что пользователям запрещено пользоваться new и delete Это понятно. А внутри функции b() кому и почему запрещено пользоваться delete? Ровно в том месте, где ты принимаешь новый объект и знаешь, что старый можно удалить (на каком основании - тоже не ясно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:05 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Undefined behaviorКонкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах. Что конкретно означает ваша фраза?? Какие практические выводы я могу сделать из этой фразы?? Мне чем-то эта фраза может помочь в решении задачи про автоматический даункастинг чужих объектов?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:07 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.DragonLumixПотому что пользователям запрещено пользоваться new и delete Это понятно. А внутри функции b() кому и почему запрещено пользоваться delete? Ровно в том месте, где ты принимаешь новый объект и знаешь, что старый можно удалить (на каком основании - тоже не ясно). Edd.Dragon, у нас сейчас нет открытой задачи про удаление объектов. Задача про автоматическое удаление уже давно РЕШЕНА шарепоинтами. Нет уже этой задачи. Она решена. Вопрос закрыт. Открытым вопрос остается только вот этот: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Но тема автоматического даункастинга чужих объектов выходит за рамки конкретно этой темы, в которой мы сейчас находимся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:10 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixUndefined behaviorКонкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах. Что конкретно означает ваша фраза?? Какие практические выводы я могу сделать из этой фразы?? Мне чем-то эта фраза может помочь в решении задачи про автоматический даункастинг чужих объектов?? Ну прочитайте, что там написано в моей фразе :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:14 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
LumixEdd.Dragon, у нас сейчас нет открытой задачи про удаление объектов. Так все же, кто мешает/мешал удалять старые объекты внутри функции b() вообще без всякого гемороя с автопоинтерами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:17 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.DragonLumixEdd.Dragon, у нас сейчас нет открытой задачи про удаление объектов. Так все же, кто мешает/мешал удалять старые объекты внутри функции b() вообще без всякого гемороя с автопоинтерами? если честно))) на тот момент, когда на сцене появились шарепоинты и я ещё не придумал подкапот через аксессор я просто не знал о таком решении Код: plaintext 1. все мое внимание было сосредоточенно на этом варианте Код: plaintext 1. отчасти потому, что я ещё попутно искал решение для Код: plaintext 1. но сейчас, с высоты уже изученной темы да, можно сказать, что в принципе можно и без шарепоинтов обойтись Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:30 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:32 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Undefined behaviorЧто конкретно означает ваша фраза?? Какие практические выводы я могу сделать из этой фразы?? Мне чем-то эта фраза может помочь в решении задачи про автоматический даункастинг чужих объектов?? Ну прочитайте, что там написано в моей фразе :)[/quot] Реально, не сочтите за троллинг, но я не знаю какой можно сделать практический вывод из вашего высказывания... вот ваша фраза Конкретно вот в этом коде происходит реинтерпрет каст предка в наследника, как и во всех других ваших вариантах. Я честно прочитал её 10 раз и не смог сделать никаких выводов. Честно!! У меня только одна реакция: да, происходит, и чо?? А мне нужен автоматический безопасный даункаст и как мне его получить??? я не знаю... и наверное ещё долго не узнаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:36 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixно сейчас, с высоты уже изученной темы да, можно сказать, что в принципе можно и без шарепоинтов обойтись Код: plaintext 1. Вот теперь вопрос и для меня закрыт )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:44 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
а был бы у вас вместо голой функции, ни на что особо не способной, объект - у вас бы ло куда больше свободы и гибкости. И данные в него засунуть можно, и операторы переопределить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 22:48 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Edd.Dragonа был бы у вас вместо голой функции, ни на что особо не способной, объект - у вас бы ло куда больше свободы и гибкости. И данные в него засунуть можно, и операторы переопределить. немного не догоняю... был бы объект вы имеете ввиду объект на месте которого сейчас объект под названием shared_ptr или какой объект вы имеете ввиду?? Edd.Dragonголой функции, ни на что особо не способной во-первых, главная задача этой функции автоматически создавать объект при первом обращении. это гарантирует всегда создание объекта и освобождает пользователей от необходимости что-то создавать самим во-вторых, за каждой этой функцией уже скрывается объект, который мы сами пишем и мы через множественное наследование можем к нему пришивать свои объекты, что мы собственно говоря и делаем другой вопрос, что может быть вы вообще намекаете на путь, который я ещё не прорабатывал даже на идейной основе, а именно вот так Код: plaintext 1. но у меня наверное сейчас уже сил не хватит этот кейс обдумать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 23:14 |
|
||
|
Как спрятать кастинг под капот
|
|||
|---|---|---|---|
|
#18+
Lumixдругой вопрос, что может быть вы вообще намекаете на путь, который я ещё не прорабатывал даже на идейной основе, а именно вот так Код: plaintext 1. фейловая гипотеза оказалась.... ссылки запрещено переназначать, только указатели Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2012, 23:57 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2020587]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
113ms |
get tp. blocked users: |
2ms |
| others: | 279ms |
| total: | 481ms |

| 0 / 0 |
