"C with Classes"
|
||||||
1 | ||||||
Чем заменить указатель05.07.2020, 10:39. Показов 3709. Ответов 48
Метки нет (Все метки)
Чем заменить можно указатель в данном примере. Что бы можно было использовать
p как объект без операции разыменования?
подозреваю, что использовать указатель в данном случае оптимальное и единственное решение, можно было бы использовать ссылку Container & если бы не было функции члена Reset
0
|
05.07.2020, 10:39 | |
Ответы с готовыми решениями:
48
Указатель или ссылка на указатель. В чем разница? Чем отличаются указатель на строку и константный указатель на строку? Указатель на указатель, в чем смысл? сма DAEWOO DWD M1029A чем заменить транс, трансформатор в обрыве, чем заменить |
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
05.07.2020, 16:40 | 22 |
_stanislav, Тут в общем вопрос касательно взаимосвязей в ООП по большому счету. Их два вида - композиция - обьект является составной частью и уничтожается вместе с хозяином, и агрегация -объект является составной частью другого объекта, ваш же объект только пользуется им в случае если такой есть - т.е. помереть может собственной смертью вне зависимости от ваших на него ссылок . Вы тут используете агрегацию. Т.е. по определению должны быть готовы к тому что кто то сторонний может уничтожить объект на который вы ссылаетесь. Разрулить ситуацию можно двумя вариантами - либо действительно weak_ptr (цена - лок при каждом обращении) либо интрузивные двунаправленные указатели (цена - более сложная реализация, в универсальном варианте - оверхед по памяти указателей от 2x, но оповещение о смерти объекта однократное).
Ну либо пересмотреть архитектуру в направление композиции очереди в ваш объект/обращения к очереди через ее хозяина.
0
|
05.07.2020, 16:41 | 23 | |||||
Можно к примеру так использовать
Или когда у нас Containe расшаривается между несколькими SomeСlassX и тогда соответственно shared_ptr.
0
|
"C with Classes"
|
|
05.07.2020, 17:07 [ТС] | 24 |
пока нет в этом нужды
Добавлено через 3 минуты Класс который передает в SomeСlass буфер, заинтересован в том что бы SomeСlass обработал этот буфер, зачем ему затирать буфер? Вообщем то класс который передает в SomeСlass буфер только и делает что заполняет этот буфер и передает на обработку в SomeСlass Добавлено через 22 минуты точнее некий класс буферезирует данные которые SomeСlass уже использует через указатель.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
05.07.2020, 17:10 | 25 | ||||||||||
не понятно, нафиг нужен этот буль.
уважающая себя, хорошо воспитанная программа не должна делать бессмысленных вещей. если очередь пуста, тогда в принципе ничего удалять из неё не нужно. Кликните здесь для просмотра всего текста
фрагмент из реального продакшен кода.
как у тебя вообще, хотя бы чисто теоретически может возникнуть ситуация, когда ты вынужден опираться на этот буль? вот объясни мне: как это вообще возможно? ты что, пишешь код по принципу: "сначала делаем, и только потом думаем?"
здрасти-приехали. твой класс должен обработать данные, которые внезапно протухли. выполнение задачи невозможно. а от выполнения этой задачи зависит жизнь людей на борту космического корабля. у тебя ошибка в коде из-за которой алгоритм в принципе не функционирует. вот бросил ты эксепшен и что? что дальше? у тебя есть 1 час времени, пока космонафты не задохнулись, и не поджарились. вообще, поражает логика некоторых людей. они думают, что эксепшен - это такая палочка-выручалочка. по волшебству исправит баг, и заставит код успешно отработать. не будет он работать.
0
|
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
|
|
05.07.2020, 17:39 | 26 |
А не лучше ли тогда и передавать владение(std::move или через unique_ptr, если контейнер не поддерживает семантику перемещения), и забрать после?
0
|
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
|
|
05.07.2020, 17:47 | 28 |
Да я бы не сказал, зато при добавлении многопоточности меньше рефакторить, имхо.
А я о чём?
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
|||||||||||
05.07.2020, 17:47 | 29 | ||||||||||
я понимаю о чем ты говоришь и в целом то что ты говоришь это как раз хорошо в плане гибкости - то есть мы сами решаем делать проверку или нет (т.е нас не кто не обязывает на постоянной основе делать проверки)... но тем не менее, отвечая на твой вопрос
можно написать такой код:
и прежде чем ты назовешь этот код плохим названием скажу что я в этой теме не защищаю какой либо подход а лишь рассматриваю в принципе возможные варианты, их плюсы и минусы если это ситуация где подобного не должно быть то да, это уже баг но если скажем твой ресурс это некий endpoint, который не спрашивая тебя может закрыть соединение с тобой, то это уже не баг. и вот мы как бы можем проверить а открыто ли еще соединение. если да - то работаем. если нет - то не работаем. и это нормально в рамках нашей задачи.
0
|
"C with Classes"
|
|
05.07.2020, 17:55 [ТС] | 30 |
интересно
Добавлено через 3 минуты zayats80888, для большей универсальности класса SomeClass лучше наверное принимать буфер по значению с перемещением.Добавлено через 3 минуты что бы зацепление ослабить
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
05.07.2020, 18:24 | 31 |
по-моему, это - какой то бред.
такое впечатление, что автору кода совершенно пофигу: будет ли в итоге удален элемент, или нет. всвязи с чем совершенно не понятно: зачем вообще он пытается удалить элемент из очереди? дело не в том: проще или нет. дело в здравом смысле. дело в ответе на вопрос: зачем удаляем? здесь по смыслу - все тоже самое, что и в первом варианте. на моей практике, все случаи работы с очередями сводились к тому, что нужно проверить: если очередь не пустая, тогда извлекаем объект и обратабываем. иначе - пропускаем до следующего раза. ещё раз: сначала выясняем: а нужно ли вообще обрабатывать? и только потом удаляем кандидат-отработанный элемент. удалять просто ради удаления - это какой то бред. все ситуации, где нужна ссылочная семантика, но не нужен шаринг, попадают под вариант с багом. все без исключения. во всех в этих ситуациях ссылка должна оставаться валидной. иначе алгоритм в принципе не сможет работать.
0
|
"C with Classes"
|
||||||
05.07.2020, 18:34 [ТС] | 32 | |||||
вот объявление класса
SomeClass если кому интересно:
0
|
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
|
|
05.07.2020, 18:34 | 33 |
Это понятно, move придется реализовать. Я к вопросу об указателе, на сколько он принципиален.
Не по теме: Сам не люблю контейнер через указатель дергать.
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
|||||||||||
05.07.2020, 18:55 | 34 | ||||||||||
почему это пофигу? автор смотрит если есть вершина то удаляет ее и выдает репорт
ну я именно сейчас говорю про то что так проще и если где-то нам нужно удалять из контейнера и с проверкой перед удалением, то проверку можно организовать по разному и в каком то случае код может быть короче но с сохранением сути - вот что я говорю... и если скажем тебе в 10 местах нужно перед удалением проверить контейнер на пустоту (или типичный find + erase) то упаковка проверки в метод позволит не только сократить код в локальном участке, это так же избавит от необходимости дублировать эти проверки во всех 10 местах... ок пусть это будет не стек... посмотри std::map::erase (перегрузка которая удаляет элемент по ключу). она как раз таки возвращает количество удаленных элементов (если 0 - значит ничего не удалили). вот есть такой вариант удаления элемента по ключу (если он есть)
то есть в одном случае мы опираясь на возвращаемое значение метода который отвечает за удаление выдаем репорт а в другом случае мы сначала проверяем есть ли элемент а потом удаляем его и выдаем репорт суть одна и та же просто первый вариант более краток причем в случае std::map::erase(key) у нас 2 варианта: возвращаемое значение либо 0 либо 1 (т.к ключи уникальные) что в принципе как раз таки намекает на bool Добавлено через 3 минуты все равно с move тоже скорее всего будут лишние операции (обычно конструктор перемещения это больше чем копирование значения единственного указателя)
1
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
05.07.2020, 19:04 | 35 |
_stanislav, Ну здесь по всей видимости стоит пересмотреть а насколько нужно выдергивать токены по одному. Возможно стоит посмотреть в сторону того, что лексер преобразовывает сразу всю входную строку в строку токенов, потом работает уже с ней. Такая строка токенов и гораздо меньше (ну к примеру для glext.h что то около 75k токенов на мегабайт текста) - т.е. работа с ней будет гораздо быстрее, ну и в результате и с указателем чужим геморроя нет и к кешу более дружелюбно будет однозначно.
0
|
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
|
||||||
05.07.2020, 19:31 | 37 | |||||
Undisputed, на сколько правильна следующая реализация (оставим пока эффективность, ну и move assignment):
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
|
05.07.2020, 19:35 | 38 |
n1b1ru,
Я ещё забыл отметить, что в случае с move будет испорчен исходный объект что может быть неприемлемо в конкретной ситуации. А на сколько правильный код о котором вы спросили уже зависит от конкретной задачи. Это зависит от того что вы пытаетесь получить в конечном счёте.
0
|
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
|
|
05.07.2020, 19:44 | 39 |
Undisputed, задача реализовать композицию.
В моем случае исходный объект временный.
0
|
"C with Classes"
|
|
05.07.2020, 19:47 [ТС] | 40 |
0
|
05.07.2020, 19:47 | |
05.07.2020, 19:47 | |
Помогаю со студенческими работами здесь
40
Чем плохой указатель на void? Итератор и указатель в чем разница Чем можно заменить заменить toggle() ? Как заменить переменную i на указатель? Строковый литерал и указатель на строку. В чем разница? Что такое указатель и с чем его есть Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |