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

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

05.07.2020, 10:39. Показов 4736. Ответов 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
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
05.07.2020, 11:15
Цитата Сообщение от _stanislav Посмотреть сообщение
подозреваю, что использовать указатель в данном случае оптимальное и единственное решение, можно было бы использовать ссылку Container & если бы не было функции члена Reset
Правильно подозреваешь, так и есть.
А смысла заменять на что-то - нет. Единственное, что можно придумать (ну, кроме удаления, std::unique_ptr, который здесь не нужен), это переопределённый оператор -> который будет вызывать исключение, в случае nullptr. Но я бы не стал так делать.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
05.07.2020, 11:20
Цитата Сообщение от _stanislav Посмотреть сообщение
Чем заменить можно указатель в данном примере. Что бы можно было использовать p как объект
Только рукописной оболочной над указателем, которая переимплементирует все до единого методы Container (т.е. объявляет все эти методы и делегирует их в указатель). Получится что-то вроде узкоспециализированного std::reference_wrapper.

Неясно только, зачем такая фигня понадобилась.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.07.2020, 11:50  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Неясно только, зачем такая фигня понадобилась.
фигня в смысле функция член Reset? или заменять указатель.

Добавлено через 7 минут
SomeСlass принимает буфер по ссылке что бы не перемещать и не копировать, он еще его чистит, и принимает следующую порцию данных при вызове Reset.

Добавлено через 11 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Правильно подозреваешь, так и есть.
А смысла заменять на что-то - нет.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Только рукописной оболочной над указателем
Спасибо за ответ.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
05.07.2020, 11:56
Цитата Сообщение от _stanislav Посмотреть сообщение
фигня в смысле функция член Reset? или заменять указатель.
Фигня в смысле: зачем нужно работать как будто напрямую с обычным объектом? Почему бы не работать как с указателем, т.е. через ->?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.07.2020, 12:03  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
зачем нужно работать как будто напрямую с обычным объектом? Почему бы не работать как с указателем
не нужно, дошло до меня.

Добавлено через 1 минуту
Я слегка поддался гипнозу, что сырые указатели это плохо.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.07.2020, 13:45
Цитата Сообщение от _stanislav Посмотреть сообщение
можно было бы использовать ссылку Container & если бы не было функции члена Reset
Ну так убери ф-цию Reset ...
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.07.2020, 13:47  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так убери ф-цию Reset
а как тогда указатель переназначить?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.07.2020, 14:28
Цитата Сообщение от _stanislav Посмотреть сообщение
подозреваю, что использовать указатель в данном случае оптимальное и единственное решение,
да. единственное и оптимальное.

вообще, всё великое множество возможных решений
неизбежно сводится к двум базовыми вариантам:
либо используем ссылку, либо указатель.

конструктор:
Цитата Сообщение от _stanislav Посмотреть сообщение
SomeСlass() : p{nullptr} {}
намекнёт проницательному читателю,
что ресурса может и не быть.

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

Цитата Сообщение от _stanislav Посмотреть сообщение
а как тогда указатель переназначить?
если нужно перенацеливать - значит нужен указатель.
ссылку нельзя перенацелить.

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

вкратце суть:
объект, который был рожден константным не должен быть изменен.
модификация такого объекта - UB.

C++
1
2
3
4
const int val = 30;
new(&val) int(10); // <--- записываем по адресу константного объекта новое значение
std::cout << val; // <--- что будет напечатенно?
// правильный ответ: UB
кто бы там что ни говорил, но ссылка - это такой замаскированный указатель.
во всяком случае, компиляторы имеют полное право реализовать семантику ссылки,
посредством константного автоматически разыменовывающегося указателя

рассмотрим класс:

C++
1
2
3
4
5
struct some
{
    some(int& r) : ref{r} {}
    int& ref;
};
компилятор может реализовать член-данных, как указатель:

C++
1
2
3
4
5
struct some
{
    some(int& r) : ptr{&r} {}
    int* const ptr;
};
обрати внимание: константный указатель.
правила языка запрещают перенацеливать ссылку.
поэтому, ассоциированный с нею указатель неизменяемый.


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

ничайно сделаешь что-то типа такого, и привет мерзким багам:
C++
1
new(&obj) some(val);
цемес в том, что ты сам лично такое может быть и не напишешь.
а вот какая нибудь фундервафля на шаблонах из 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 очереди при необходимости.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class SomeClass {
private:
    using Container = std::queue<int>;
    Container p;
 
public:
    SomeClass() {}
    SomeClass(Container& r) : p{r} {}
 
    void Reset(Container& r) {
        p = r;
    }
};
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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.07.2020, 15:24
Цитата Сообщение от Undisputed Посмотреть сообщение
Скажу что конструктор который принимает ссылку и берет адрес исходного объекта не очень хорошо выглядит в плане архитектуры потому что такой подход заставляет больше напрягаться при разработке и вот почему:
расскажи это разработчикам... например, string_view.
ну или приведи хотя бы один реальный пример,
который вынудит программиста напрячься.

Цитата Сообщение от Undisputed Посмотреть сообщение
предлагаю заменить обычный указатель на shared_ptr
глупое предложение.

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

очень тупо использовать шаристый указатель в условиях,
когда он нафиг никому не нужен.
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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.07.2020, 16:00
Цитата Сообщение от Undisputed Посмотреть сообщение
По поводу string_view думаю что все таки это плюсы, и очень часто стандартные фичи не обвязаны какими то дополнительными проверками, что бы не было оверхеда.
на самом деле в конструкции стандартных механизмов овер 100500 разных проверок.
одни только студийные итераторы чего стоят.

дело не в "дополнительных проверках".
ты можешь реализовывать какие угодно проверки.

дело в здравом смысле.


Цитата Сообщение от Undisputed Посмотреть сообщение
По поводу shared_ptr: в данном случае явно видно что объект на который есть ссылка внутри SomeClass может быть использован и за пределами SomeClass.
ты передаешь объект по ссылке.
итак понятно, что он может быть использован за пределами SomeClass

Цитата Сообщение от Undisputed Посмотреть сообщение
В таком случае это как раз тот случай когда мы share-им обьект между принципиально двумя разными контекстами...

нефига подобного.


любая с++ архитектура в конечном счете даёт ответы на два фундаментальных вопроса:
1. кто о ком знает?
2. кто кем владеет?

ну так вот.
есть класс, который принимает объект по ссылке (указателю).
тобишь, он не владеет ресурсом, но хочет им пользоваться.

и вот здесь у тебя есть только два варианта:

1.
ты считаешь нормальной ситуацию,
когда к моменту эксплуатации ресурса, выясняется, что ресурс протух.

например: пришел запрос от юзера. смотрим:
если сессия протухла, тогда заново просим его авторизоваццо.
иначе - работаем с уже имеющейся сессией.

в этом случае ты используешь связку shared/weak

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





Цитата Сообщение от Undisputed Посмотреть сообщение
В целом как уже говорил я не знаю что за задача.
но ты знаешь, что человек изначально не использовал shared/weak.
из чего не сложно сделать вывод: шаринг ему без надобности.
из чего не сложно сделать вывод: у него 2й вариант.
из чего не сложно сделать вывод: weak ему не нужен.

Добавлено через 3 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
То о чем я говорю просто более безопасный вариант
допустим ты поюзал weak.
и узнал что ресурс протух.
этого не должно было быть.
у тебя баг в коде.

и куда смотрела твоя служба безопасности?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.07.2020, 16:12
Да не особо понятно как SomeСlass, Container ведут/используются после создания/задания так что о shared_pointer рано судить.

Добавлено через 2 минуты
Цитата Сообщение от _stanislav Посмотреть сообщение
а как тогда указатель переназначить?
Никак. Создать новый SomeСlass для нового Container-ра.
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
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.07.2020, 16:28
Цитата Сообщение от Undisputed Посмотреть сообщение
Где то они (проверки) могли бы добавить безопасности, но отсутствуют (в этом смысле имею ввиду).
Безопасность как бы ценой производительности не С++ - путь. Но вообще все зависит задачи.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2020, 16:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru