11 / 11 / 11
Регистрация: 18.01.2016
Сообщений: 97
1

Использование умных указателей

20.11.2017, 01:15. Показов 745. Ответов 6
Метки нет (Все метки)

Всем привет!
Недавно наконец попробовал использовать умные указатели и мне понравилось, но возникло пару вопросов:
1. Есть unique_ptr и есть функция которая например выполняет роль строителя, какой из вариантов будет более корректным:
Полностью на unique_ptr
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::unique_ptr<MyStruct> foo(std::unique_ptr<MyStruct> myStruct)
{
    ...
 
    return std::move(myStruct);
}
 
int main(int argc, char **argv)
{
  ... 
 
   std::unique_ptr<MyStruct> myStruct(new MyStruct);
 
   myStruct = foo(std::move(myStruct));
 
   ...
 
    return 0;
}
или с передачей указателей

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void foo(MyStruct* myStruct)
{
    ...
}
 
int main(int argc, char **argv)
{
  ... 
 
   std::unique_ptr<MyStruct> myStruct(new MyStruct);
 
   foo(myStruct.get());
 
   ...
 
    return 0;
}
или лучше использовать shared_ptr?

2. В случае если поле класса умный указатель, как лучше реализовать геттеры, сделать поле unique_ptr и взращать константный указатель, или сделать поле shared_ptr?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2017, 01:15
Ответы с готовыми решениями:

Использование умных указателей
В каких случаях вы используете умные указатели, а в каких обычные?

Правильное использование умных указателей, как членов класса
Допустим у нас есть класс Node, объекты которого могут хранить вложенные Node, как правильнее...

Подсчет умных указателей
Здравствуйте! Столкнулся с проблемой реализации умных указателей . Совсем не выходит написать...

Приведение типов умных указателей
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template&lt;typename...

6
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
20.11.2017, 01:57 2
1. Умные указатели + константные ссылки
2. Я б использовал shared_ptr и возвращал какой-нибуть weak_ptr. Все зависит от контекста.
0
11 / 11 / 11
Регистрация: 18.01.2016
Сообщений: 97
20.11.2017, 02:04  [ТС] 3
Вы имеете ввиду ссылку на unique_ptr?
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
20.11.2017, 02:06 4
Цитата Сообщение от Colt_11 Посмотреть сообщение
Вы имеете ввиду ссылку на unique_ptr?
угу... Имеется ввиду не постоянно мувать (исходя из контекста использовать и ссылки)
0
Эксперт С++
8703 / 4287 / 954
Регистрация: 15.11.2014
Сообщений: 9,728
20.11.2017, 11:32 5
Цитата Сообщение от Colt_11 Посмотреть сообщение
или лучше использовать shared_ptr?
вы разберитесь для начала,
для каких целей служит тот или иной смарт-поинтер.

когда у вас понимание:

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

юник - там, и только там,
где нужно гарантировать единственного владельца.

и тд.

вот тогда такие вопросы отпадут сами собой.

Добавлено через 30 секунд
Цитата Сообщение от Colt_11 Посмотреть сообщение
foo(myStruct.get());
говнокод.
0
11 / 11 / 11
Регистрация: 18.01.2016
Сообщений: 97
20.11.2017, 11:45  [ТС] 6
Ну если вам удалось разобраться и заданные мной вопросы кажутся очевидными, то не могли бы вы поделиться своим мнением по этому поводу?
Я понимаю что говнокод, потому и спрашиваю как лучше
0
Эксперт С++
8703 / 4287 / 954
Регистрация: 15.11.2014
Сообщений: 9,728
20.11.2017, 11:53 7
Цитата Сообщение от Colt_11 Посмотреть сообщение
не могли бы вы поделиться своим мнением по этому поводу?
могу предложить вам составить список
известных вам наименований смарт-поинтеров,
и потом по каждому загуглить материал.

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

например:

рассмотрим шаред_птр.

допустим, вы делаете игру.
(пример притянут на уши, но назначение шареда иллюстрирует)

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

можно расшарить объект "текстура" на все танки одной модели сразу же.
танков много - текстурка одна.

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

как бы вы это сделали?

теперь смотрите принцип работы и использования std::shared_ptr

со всеми остальными смартами - аналогично.
вам нужны моральные примеры-использования,
которые иллюстрируют их назначение
и очевидный профит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2017, 11:53
Помогаю со студенческими работами здесь

Подскажите как переписать класс с использованием умных указателей, либо STL
К сожалению, знания об умных указателях и библиотеке STL прошли мимо меня... Сейчас пытаюсь...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя.
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между...

Использование указателей
я не могу понять как работает эта задача: long A={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,...

Использование указателей
Здравствуйте, немного не понимаю как правильно использовать указатели, например, я знаю, что при...

использование указателей
Подскажите, пожалуйста, в чем здесь ошибка? #include &lt;iostream&gt; using namespace std; int x =...

использование указателей
Должна быть разработана программа с меню с использованием указателей: 1. Изменить порядок...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru