Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

Чем заменить указатель

05.07.2020, 10:39. Показов 5175. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чем заменить можно указатель в данном примере. Что бы можно было использовать p как объект без операции разыменования?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <queue>
 
class SomeСlass
{
private:
    using Container = std::queue<int>;
    Container * p;
 
public:
    SomeСlass() : p{nullptr} {}
    SomeСlass(Container & r) : p{&r} {}
 
    void Reset(Container & r)
    {
        p = &r;
    }
};
Добавлено через 6 минут
подозреваю, что использовать указатель в данном случае оптимальное и единственное решение, можно было бы использовать ссылку Container & если бы не было функции члена Reset
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2020, 10:39
Ответы с готовыми решениями:

Указатель или ссылка на указатель. В чем разница?
Есть вопрос про указатели и ссылки на указатели :scratch: Хочу в функциях f1() и в f2() динамически выделить память и возвратить этот...

Чем отличаются указатель на строку и константный указатель на строку?
Просто обьясните, как такое возможно? char *a=&quot;fff&quot;; В чем отличие от этого? : const char *a=&quot;fff&quot;; Ведь так и так...

Указатель на указатель, в чем смысл?
BOOL WTSEnumerateProcesses( _In_ HANDLE hServer, _In_ DWORD Reserved, _In_ DWORD Version, _Out_ PWTS_PROCESS_INFO...

48
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
05.07.2020, 19:51
Студворк — интернет-сервис помощи студентам
_stanislav, rvalue reference?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
05.07.2020, 19:52
n1b1ru,
Если речь о композиции типа Container относительно типа SomeClass, то вы уже её реализовали и сделали это правильно потому что время жизни поля типа Container зависит от времени жизни обьекта типа SomeClass. Что касается присвоения нового значения Container-у путём копирования или перемещения с использованием соответствующего оператора присваивания, то это лишь замена данных того же самого обьекта, время жизни которого все ещё зависит от времени жизни SomeClass.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.07.2020, 19:52  [ТС]
Цитата Сообщение от n1b1ru Посмотреть сообщение
rvalue reference?
да, зачем там &&?
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
05.07.2020, 19:59
_stanislav, чтобы указать на временный объект, данные которого можно "украсть".
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.07.2020, 20:02  [ТС]
Цитата Сообщение от n1b1ru Посмотреть сообщение
чтобы указать на временный объект, данные которого можно "украсть".
понятно, перегрузка для lvalue и rvalue:
C++
1
2
SomeClass(Container &);
SomeClass(Container &&);
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
05.07.2020, 20:07
Undisputed, это я понимаю.
Цитата Сообщение от Undisputed Посмотреть сообщение
все равно с move тоже скорее всего будут лишние операции
Получается в случае с композицией эффективней метода не придумать.
Может не с того начал диалог. В любом случае спасибо
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.07.2020, 21:27
Цитата Сообщение от Undisputed Посмотреть сообщение
почему это пофигу? автор смотрит если есть вершина то удаляет ее и выдает репорт
ты привел в качестве примера код,
в котором непонятно зачем удаляется элемент.
может пример не очень удачный?
вот нафига автор смотрит и удаляет элемент?


один человек как то сокрушался, почему очередь не умеет снимать объект с вершины:
C++
1
auto element = q.pop();
ему не нравится, что приходится делать в два действия:
C++
1
2
auto element = std::move(q.front());
q.pop();
и я могу понять терзания этого человека.
они по крайней мере логически обоснованны.
в действительности: pop без front получается как бе не нужным.

ты же приводишь фрагмент некоторого алгоритма,
где может быть (а может и не быть) будет удален объект.
раз алгоритм допускает оба варианта,
значит ему не принципиально будит ли объект удален по итогу, или нет.

отсюда два закономерных вопроса:
1.
нафига он вообще удаляет элемент?

2.
какая разница, получилось или нет,
если это все равно не влияет на работу алгоритма?
ну то есть, зачем проверять результат операции?


Цитата Сообщение от Undisputed Посмотреть сообщение
посмотри std::map::erase
в std полным полно ненужных (логически не обоснованных вещей)
вот например, лично тебе хоть раз понадобилась эта информация?

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


я могу привезти множество примеров вида:

C++
1
2
3
4
auto it = map.find(key);
if(it != map.cend())
    process(it),
    map.erase(it);
но я не могу даже просто предствить себе ни одного примера,
где было бы критично знать: был ли удален элемент или нет:

C++
1
2
// --- ну и нафиг нужен этот result?
const auto result = map.erase(key);
дело в том, что такой подход предполагает,
что ключ может существовать, а может и не существовать.
и оба варианта одинако приемлимы.
ну и нафига тогда нужен result ?

более того, можно смело считать, что каждый раз ключа не существует.
даже если это не так, это всё равно не окажет никакого влияния на алгоритм,
которому априори пофигу: существует ли ключ в природе, или нет.

Цитата Сообщение от Undisputed Посмотреть сообщение
auto it = m.find(1);
if (it != m.end()) {
    m.erase(it);
    std::cout << "erased\n";
}
у меня есть подозрения, что дизайн std формировался под влиянием двух сил:
первые хотят максимальный перфоманс, и до последнего считали,
что земля круглая потоки не нужны.

вторые же хотят дизайн который который сможет дружить с многопоточностью.
и даже если map не многопоточный, всегда можно будет запилить atomic_map,

дизайн: auto it = m.find(key);
не дружит с многопоточкой.

в действительности, то, что it сейчас валидный, не значит,
что ты сможешь безопасно заюзать его в erase в многопоточной среде.

вариации на тему:
C++
1
const size_t count = m.erase(key);
позволяют безопасно удалять элементы из разных потоков,
с возможностью предоставить отчет о результатах работы.

в многопоточной среде такой дизайн - единственный нормальный способ работы.

в то время, как сама концепция итераторов (и вообще любая указательно/ссылочная семантика) не дружит с многопоточностью.


фокус в том, что парни из первой группы победили.
std не поддерживает многопоточность.
и никогда не будет поддерживать.

в текущих реалиях
итераторы очень востребованны.
и совершенно не понятно, нафиг нужен такой erase.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
05.07.2020, 22:49
hoggy,
Я специально привёл пример где "сначала смотрит есть ли элемент, а потом удаляет" вместе с примером "не нужно сначала смотреть, можно попытаться удалить типа try_erase и узнать удалось ли это". То есть в одном случае erase ничего не возвращает, и мы не понимаем удалось ли удалить (а нам надо это знать)... Поэтому перед удалением приходится смотреть, а есть ли вообще такой элемент... а в другом erase возвращается значение и на основе того что вернула функция можно понять, что произошло внутри функции.

Теперь о том, где это может быть нужно:
где нужно удалять по ключу, и при этом важно: был объект удален, или нет?
Допустим ты пишешь десктопную программу, которую одновременно могут использовать сразу несколько клиентов (пусть это будет некая ERP). Все клиенты нацелены на одну и ту же БД. Когда ты открыл программу, в списке товаров у тебя была погремушка (ну или не была, ты её ещё не подгрузил из БД). Другой клиент зашёл после тебя и удалил этот товар. Далее сервер отправляет тебе уведомление что товар с ID = N был удалён. Клиент на твоей машине смотрит, подгружал ли он этот товар который был удалён другим клиентом и если да, то нужно выдать меседжбокс что этот товар был удалён другим сотрудником и убрать его из списка.

Сами товары в памяти например хранятся в map, где ключ это ID товара а значение - сам объект товара. Так вот, получив сигнал от сервера (вместе с ID удаленного товара) ты смотришь в map и если по ключу нашёлся среди подгруженных товаров тот товар который удалил другой клиент, то ты понимаешь что пора убирать товар из списка и показывать меседжбокс с сообщением что этот товар был удалён)...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.07.2020, 23:50
Цитата Сообщение от Undisputed Посмотреть сообщение
(а нам надо это знать)
я так и не понял: зачем это нужно знать?

Цитата Сообщение от Undisputed Посмотреть сообщение
Далее сервер отправляет тебе уведомление что товар с ID = N был удалён.
и вот нахрена мне это уведомление?

Цитата Сообщение от Undisputed Посмотреть сообщение
Клиент на твоей машине смотрит, подгружал ли он
вот эти непонятные напряги моему клиенту зачем нужны????



ты вэбом када нить занимался?
знаешь как интернет-магазины устроенны?

клиент поклал погремушку в корзинку.
тот факт, что погремушки уже нет (потому что она была последняя, и её уже купили)
вообще никого не парит.

информация о том сколько шт есть в наличии - весьма условна.
она обновляется, допустим, раз в 5 минут, а может быть раз в 1 час.
и это вполне устраивает и клиентов, и магазин.

клиент может ещё по 100 раз туда/сюда товары перекладывать.
и пока он не нажмет кнопку: "подтвердить заказ",
никто даже не заморачивается.

интересное начинается только когда клиент нажимает на кнопку "подтвердить заказ".
причем в зависимости от стратегии магазина,
тебе могут запросто оформить например, видео-карточку,
которой сейчас нет в наличии.

потом с тобой свяжеццо менеджер и скажет:
"бла бла бла, товара сейчас нет в наличии. не горит подождать пару дней?"

вообще это хорошая попытка:
проиллюстрировать сабж на примере работы с бд и клиентами.

на таких примерах очень красноречиво видны два момента:

1.
морда в принципе не владеет точной информацией о состоянии дел клиента.
если сообщение не пришло, это ещё не значит, что товар не нужно убирать из списка.
(может у тебя диссконнект, и сообщение просто затерялось по дороге?)


2.
по этой причине у тебя всегда должна быть возможность запросить статус (состояние)
по любым твоим операциям.

морда не знает, и не может знать точное (актуальное) состояние клиента
но всегда может запросить статус клиента перед тем,
как начнет исполнять манипуляции над ним.


пример говнокода:
клиент отправляет запрос на создание новой позиции, и в ответ ожидает id открытой позиции.

почему говнокод?
потому что клиент не дождался ответа на свой запрос.
внимание вопрос: так позиция была в итоге открыта, или нет?
ответ: неизвестно.


пример правильной работы:

клиент сначала запрашивает id сессии.
если не получил - даже не пытается больше ничего делать.
если получил, тогда запрашивает создание новой позиции в контексте своей сессии.

теперь, даже если что-то пошло через жопу,
всегда можно повторно запросить :
"моя сессия такая то, каков статус моей операции?"


и второй момент.

допустим, ты решил удалить из БД всех Ивановых.
ты инициируешь запрос на удаление.

"удалить всех Ивановых"
в ответ приходит:
"100500 Ивановых было успешно удалено".

и вот здесь все люди деляццо на две категории.
первые думают, что удалили всех Ивановых. аж целых 100500 теперь горит в аду.

люди из второй категории понимают:
фраза: "100500 Ивановых было успешно удалено" носит исключительно информационый характер.
исключительно для того, что бы удовлетворить поверхностное любопытство клиентов.
но с технической точки зрения она не имеет никакого значения.

разговор программиста и менеджера:

П: - ну и какая нам разница, сколько там было этих Ивановых?
М: - вообще по барабану
П: - а нафига мы тогда эту табличку с сообщением делаем????
М: - это табличка нужна не нам. она нужна нашим клиентам, что бы те видели, что происходит. это повышает доверие к бизнесу.
с технической же точки зрения,
там прямо сейчас опять уже может быть 10005000 пресловутых Ивановых.
хотя бы потому, что другой клиент в параллель накачал новеньких.

в многопоточной среде (когда в системе присутствует множество клиентов)
отдельный клиент в принципе никак не может контролировать,
и закладываться на какие то конкретные состояния БД.

вот и получается, что дизайн:
C++
1
const size_t count = db.erase("Ivanov");
нужен лишь для того что бы удовлетворить поверхностное любопытство клиентов.

алгоритмам count не нужен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2020, 23:50

сма DAEWOO DWD M1029A чем заменить транс, трансформатор в обрыве, чем заменить
день добрый. модуль PN:361430A950 первичная транса в обрыве . может кто подскажет параметры , или советом о замене . есть лыжевский на...

Чем плохой указатель на void?
Здравствуйте! Недавно прочитал статью на хабре http://habrahabr.ru/post/102930/ Сабж - архитектура игрового двигла, а именно менеджер...

Итератор и указатель в чем разница
Здравствуйте, Подскажите пожалуйста, вот есть такое определение: Для получения итераторов контейнеры в C++ обладают такими...

Чем можно заменить заменить toggle() ?
Добрый день, у меня такой вопрос. Чем можно заменить toggle(function(), function()); В ранних версиях toggle можно было использовать как...

Как заменить переменную i на указатель?
вычисляю факториал числа. нужно заменить переменные на указатели. две переменные заменил, прога работает. третья переменная (i) пока не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
49
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru