|
"C with Classes"
|
||||||
Чем заменить указатель05.07.2020, 10:39. Показов 4736. Ответов 48
Метки нет (Все метки)
Чем заменить можно указатель в данном примере. Что бы можно было использовать
p как объект без операции разыменования?
подозреваю, что использовать указатель в данном случае оптимальное и единственное решение, можно было бы использовать ссылку Container & если бы не было функции члена Reset
0
|
||||||
| 05.07.2020, 10:39 | |
|
Ответы с готовыми решениями:
48
Указатель или ссылка на указатель. В чем разница? Чем отличаются указатель на строку и константный указатель на строку? Указатель на указатель, в чем смысл? |
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 05.07.2020, 11:15 | ||
|
А смысла заменять на что-то - нет. Единственное, что можно придумать (ну, кроме удаления, std::unique_ptr, который здесь не нужен), это переопределённый оператор -> который будет вызывать исключение, в случае nullptr. Но я бы не стал так делать.
0
|
||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 05.07.2020, 11:20 | ||
Container (т.е. объявляет все эти методы и делегирует их в указатель). Получится что-то вроде узкоспециализированного std::reference_wrapper.Неясно только, зачем такая фигня понадобилась.
0
|
||
|
"C with Classes"
|
||||
| 05.07.2020, 11:50 [ТС] | ||||
|
Добавлено через 7 минут SomeСlass принимает буфер по ссылке что бы не перемещать и не копировать, он еще его чистит, и принимает следующую порцию данных при вызове Reset.Добавлено через 11 минут
0
|
||||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 05.07.2020, 11:56 | ||
->?
0
|
||
|
"C with Classes"
|
||
| 05.07.2020, 12:03 [ТС] | ||
![]() Добавлено через 1 минуту Я слегка поддался гипнозу, что сырые указатели это плохо.
0
|
||
|
"C with Classes"
|
|
| 05.07.2020, 13:47 [ТС] | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||
| 05.07.2020, 14:28 | ||||||||||||||||||||||||
|
вообще, всё великое множество возможных решений неизбежно сводится к двум базовыми вариантам: либо используем ссылку, либо указатель. конструктор: что ресурса может и не быть. такую возможность предоставляет только и только указатель. нулевых ссылок не бывает. ссылку нельзя перенацелить. кроме этого, у ссылок есть такой побочный нежданчик: можно неиилюзорно и неочевидно внезано налететь на UB вкратце суть: объект, который был рожден константным не должен быть изменен. модификация такого объекта - UB.
во всяком случае, компиляторы имеют полное право реализовать семантику ссылки, посредством константного автоматически разыменовывающегося указателя рассмотрим класс:
правила языка запрещают перенацеливать ссылку. поэтому, ассоциированный с нею указатель неизменяемый. и вот теперь ты должен всегда иметь ввиду, что твой объект нельзя переинециализировать. ничайно сделаешь что-то типа такого, и привет мерзким багам:
а вот какая нибудь фундервафля на шаблонах из boost - запросто. потому и нежданчик. и вот теперь задай себе правильный вопрос: нафига нужны все эти проблемы и ограничения ссылок, если все те же самые ништяки можно заполучить через указатель, проблем и ограничений - меньше. ништяков - больше.
0
|
||||||||||||||||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 05.07.2020, 15:00 | |
|
_stanislav,
Скажу что конструктор который принимает ссылку и берет адрес исходного объекта не очень хорошо выглядит в плане архитектуры потому что такой подход заставляет больше напрягаться при разработке и вот почему: работа с экземпляром класса SomeСlass всегда подразумевает то, что всегда нужно держать в голове время жизни объекта типа Container от которого зависит SomeСlass. Так же напрягает что можно сделать так: SomeСlass obj(container) и как бы не глядя в исходники не совсем понятно насколько объекты типа SomeСlass и container независимы друг от друга в плане lifetime. Если производительность не критична и нужен именно такой подход (агрегация) то предлагаю заменить обычный указатель на shared_ptr или weak_ptr в зависимости от того что нужно в конечном счете. Если будет shared_ptr, то пока экземпляр SomeСlass еще не протух, container-ом можно будет пользоваться внутри SomeСlass. Если же это будет weak_ptr, то его всегда можно проверить на предмет "а не протух ли объект, на который мы ссылаемся?" и если протух, то например бросить эксепшен. Так будет безопаснее. Не знаю конечно что за задача, но все же решил сказать об этом т.к это может пригодится.
0
|
|
|
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
|
||||||
| 05.07.2020, 15:08 | ||||||
|
_stanislav, я может что-то не понял, а без указателя нельзя реализовать?
Ну и проверять size очереди при необходимости.
0
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 05.07.2020, 15:16 | |
|
n1b1ru,
тогда будет срабатывать оператор присваивания копированием (к чему лишние копии?) вот тут p = r; Добавлено через 6 минут а тут конструктор копирования для Container... SomeClass(Container& r) : p{r}
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 05.07.2020, 15:24 | |||
|
ну или приведи хотя бы один реальный пример, который вынудит программиста напрячься. потому что если юзается обычный указатель, значит по задаче его шарить не нужно. очень тупо использовать шаристый указатель в условиях, когда он нафиг никому не нужен.
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 05.07.2020, 15:41 | |
|
hoggy,
По поводу string_view думаю что все таки это плюсы, и очень часто стандартные фичи не обвязаны какими то дополнительными проверками, что бы не было оверхеда. По поводу shared_ptr: в данном случае явно видно что объект на который есть ссылка внутри SomeClass может быть использован и за пределами SomeClass и SomeClass не контролирует его lifetime. В таком случае это как раз тот случай когда мы share-им обьект между принципиально двумя разными контекстами... То есть в данном случае используется агрегация. В целом как уже говорил я не знаю что за задача. То о чем я говорю просто более безопасный вариант (смысл этой безопасности описывал выше)
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 05.07.2020, 16:00 | ||||||
|
одни только студийные итераторы чего стоят. дело не в "дополнительных проверках". ты можешь реализовывать какие угодно проверки. дело в здравом смысле. итак понятно, что он может быть использован за пределами SomeClass нефига подобного. любая с++ архитектура в конечном счете даёт ответы на два фундаментальных вопроса: 1. кто о ком знает? 2. кто кем владеет? ну так вот. есть класс, который принимает объект по ссылке (указателю). тобишь, он не владеет ресурсом, но хочет им пользоваться. и вот здесь у тебя есть только два варианта: 1. ты считаешь нормальной ситуацию, когда к моменту эксплуатации ресурса, выясняется, что ресурс протух. например: пришел запрос от юзера. смотрим: если сессия протухла, тогда заново просим его авторизоваццо. иначе - работаем с уже имеющейся сессией. в этом случае ты используешь связку shared/weak 2. ресурс априори должны быть валидным. ситуация, когда он нужен, а он внезапно протух - это программная ошибка. в этом случае weak тебя не спасет. из чего не сложно сделать вывод: шаринг ему без надобности. из чего не сложно сделать вывод: у него 2й вариант. из чего не сложно сделать вывод: weak ему не нужен. Добавлено через 3 минуты и узнал что ресурс протух. этого не должно было быть. у тебя баг в коде. и куда смотрела твоя служба безопасности?
0
|
||||||
|
|
||
| 05.07.2020, 16:12 | ||
|
Да не особо понятно как SomeСlass, Container ведут/используются после создания/задания так что о shared_pointer рано судить.
Добавлено через 2 минуты
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 05.07.2020, 16:25 | |
|
hoggy,
Да, проверки есть но нужно так же признать что они есть не везде. Где то они (проверки) могли бы добавить безопасности, но отсутствуют (в этом смысле имею ввиду). Например в std::stack: op не делается проверка на то что есть ли элемент в стеке или нет. Это как бы оставляют на конечного пользователя тем самым не создают оверхед но при этом оставляют конечному пользователю возможность сделать эту проверку самому хотя они могли бы например возвращать bool как результат операции удаления типа удалилось или нет и не вводить UB если контейнер окажется пустым (вот что я имел ввиду когда говорил про оверхед при навязывании безопасного обращения с объектами).Что касается того что "ресурс всегда должен быть валидным когда он нужен и если его нет то это программная ошибка и weak_ptr не поможет" то тут я не согласен. Мы ведь может вызвать use_count для weak_ptr при уничтоженном объекте на который был нацелен соответствующий shared и это не будет UB и никаких программных ошибок не будет. Если use_count == 0, можем бросить эксепшен. Как уже говорил я не знаю в чем конкретно заключается его задача и не видел всю окружающую среду. Мой пример был достаточно абстрактным, который может подходить в его случае, а может и не подходить так как возможно по структуре у него в принципе не может возникнуть ситуации когда container протухает раньше чем SomeClass
0
|
|
|
"C with Classes"
|
|
| 05.07.2020, 16:29 [ТС] | |
|
Undisputed, если указатель не
nullptr то он валидный, остается только перед использованием проверить queue::empty
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 05.07.2020, 16:33 | |
|
Avazart,
Да, вот именно это я и имел ввиду про безопасность, что в С++ этим особо не балуются в угоду производительности _stanislav, тогда норм, значит то о чем я говорил это не твой случай
0
|
|
| 05.07.2020, 16:33 | |
|
Помогаю со студенческими работами здесь
20
сма DAEWOO DWD M1029A чем заменить транс, трансформатор в обрыве, чем заменить
Итератор и указатель в чем разница Чем можно заменить заменить toggle() ? Как заменить переменную i на указатель? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|