Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38076154&tid=2020587]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 283ms |
| total: | 551ms |

| 0 / 0 |
