170 похожих чатов

Так делают обычно? auto engine = std::make_shared<Engine>(); auto car = std::make_shared<Car>(); car.SetEngine(engine);

71 ответов

14 просмотров

А почему не в конструкторе передавать?

Нет Shared ptr не нужен

делают, но это скорее обязательная зависимость, так что инъекция через метод выглядит странно немного)

Nobody
Нет Shared ptr не нужен

Сильное утверждение

Ramil-Rizvanov Автор вопроса
Denis P
делают, но это скорее обязательная зависимость, та...

а если потом надо будет заменить двигатель?

Ramil Rizvanov
а если потом надо будет заменить двигатель?

потом замените, но в конструкторе хорошо бы хоть какой-то наверное затребовать

Ramil-Rizvanov Автор вопроса
Denis P
потом замените, но в конструкторе хорошо бы хоть к...

но плодить методы SetEngine это норма? как вообще принято? я знаю как в Java, знаю как в C#, но в плюсах никак не разберу

Алексей
Почему? Инкапсуляция же

Потому что чем иммутабельнее объект, тем лучше

Nobody
Потому что чем иммутабельнее объект, тем лучше

Ну Геттеры как раз его делают менее мутабельным

Ramil Rizvanov
но плодить методы SetEngine это норма? как вообще ...

Ты хочешь у машины на лету менять движок?

Nobody
Это не норма даже в джаве и шарпе

Для всяких DTO это норм, но в плюсах это просто структуры плоские

Ramil-Rizvanov Автор вопроса

Если владелец один, то зачем shared_ptr, а не unique?

Ramil-Rizvanov Автор вопроса
Stas
Если владелец один, то зачем shared_ptr, а не uniq...

потому что фабрика может ссылаться на этот двигатель

Ramil Rizvanov
потому что фабрика может ссылаться на этот двигате...

может ссылаться, это ещё не значит, что владеть

Ramil Rizvanov
потому что фабрика может ссылаться на этот двигате...

Короче, shared_ptr надо использовать только там, где имеет место быть общее владение одним объектом несколькими другими. Иначе надо использовать unique_ptr

Ramil-Rizvanov Автор вопроса
Stas
Короче, shared_ptr надо использовать только там, г...

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

Ramil Rizvanov
так я же пишу, машина ссылается на двигатель, фабр...

> фабрика который сделала двигатель ссылается на двигатель Зачем

Ramil Rizvanov
так я же пишу, машина ссылается на двигатель, фабр...

а кто владеет двиагетелем? кто его уничтожает и создаёт?

Ramil Rizvanov
так я же пишу, машина ссылается на двигатель, фабр...

Так у вас не ссылается, а владеет. Такое ощущение, что на одном двигателе может несколько машин уехать

Ramil-Rizvanov Автор вопроса
Слава
Так у вас не ссылается, а владеет. Такое ощущение,...

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

Ramil Rizvanov
это субъективно, шаред это прежде всего умный указ...

Это не субъективно Это best practice в С++, которая сложилась за 10 лет

Ramil-Rizvanov Автор вопроса
Sergey Skvortsov
Как и unique_ptr; почему вы выбрали shared?

машина может быть уничтожена, но информация о двигателе у фабрики двигателей должна быть

Ramil Rizvanov
машина может быть уничтожена, но информация о двиг...

Двигатель и информация о двигателе — это разные сущности

Ramil-Rizvanov Автор вопроса
Nobody
Это не субъективно Это best practice в С++, котора...

дайте ссылку бест практисов где 99% шареды зло

Ramil Rizvanov
машина может быть уничтожена, но информация о двиг...

Это звучит потрясающе странно Пусть фабрика владеет, раз двигатели в ней живут

Ramil Rizvanov
это субъективно, шаред это прежде всего умный указ...

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

Ramil-Rizvanov Автор вопроса
Sergey Skvortsov
Это звучит потрясающе странно Пусть фабрика владее...

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

Ramil Rizvanov
дайте ссылку бест практисов где 99% шареды зло

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#f27-use-a-shared_ptrt-to-share-ownership https://github.com/cpp-best-practices/cppbestpractices/blob/master/08-Considering_Performance.md Prefer unique_ptr to shared_ptr

Ramil-Rizvanov Автор вопроса
Stas
в вашем примере шаред не нужен. он нужен, например...

пример был выдуман, путь и не очень удачно

Ramil Rizvanov
ну я не отрицаю что тут и юник подойдет, достаточн...

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

Ramil-Rizvanov Автор вопроса
Nobody
https://isocpp.github.io/CppCoreGuidelines/CppCore...

Because of this it is more efficient than the shared_ptr ещё раз говорю, что я соединяю макро компоненты, тут влияние шаредов на производительность - ничтожна

Ramil-Rizvanov Автор вопроса
Stas
если при уничтожении машины, двигатель не уничтожа...

говорят, если вы не на низком уровне, то голые указатели лучше не трогать

Ramil Rizvanov
Because of this it is more efficient than the shar...

Проблема не только в производительности Код сложнее читать потому что "всё владеет всем" — это ужасно

Ramil Rizvanov
Because of this it is more efficient than the shar...

Ну вот же Prefer a unique_ptr over a shared_ptr if there is never more than one owner at a time. shared_ptr is for shared ownership.

Ramil Rizvanov
говорят, если вы не на низком уровне, то голые ука...

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

Ramil Rizvanov
Because of this it is more efficient than the shar...

shared_ptr нужен не для того, чтобы пользоваться им, когда лень думать о владении

Ramil-Rizvanov Автор вопроса
Ramil Rizvanov
но и так тоже можно)

В плюсах нельзя не думать о владении

Ramil-Rizvanov Автор вопроса
Stas
причём тут UB?

когда под сырым указателем не будет валидного объекта

Ramil Rizvanov
говорят, если вы не на низком уровне, то голые ука...

Нет, это заблуждение. Не трогать лучше new/delete, это разные вещи

Ramil-Rizvanov Автор вопроса
Eyed Shovel
Нет, это заблуждение. Не трогать лучше new/delete,...

а если объект уже кто-то удалил? тот же умный указатель?

Ramil-Rizvanov Автор вопроса
Eyed Shovel
shared ptr создан не для этого

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

Ramil Rizvanov
он создан чтобы объект жил пока жив умный указател...

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

Ramil-Rizvanov Автор вопроса
Ramil Rizvanov
да мне надо шарить объект)

для начала можно посмотреть, точно ли для этого не хватит конкретного одного владельца + не владеющих ссылок/указателей

Ramil Rizvanov
да мне надо шарить объект)

Вам кажется, что нужно :)

Ramil Rizvanov
а если объект уже кто-то удалил? тот же умный указ...

Если кто-то удалил, а тот, кто пользуется указателем остался - код говно, используй shared_ptr. Если struct observer {}; struct A { // конструктор // observer* ptr; }; struct B { observer m_observer; A m_a(&m_observer); } То таких проблем не может возникнуть.

Ramil-Rizvanov Автор вопроса
Eyed Shovel
Если кто-то удалил, а тот, кто пользуется указател...

тут сам Страуструп велел ссылкой пользоваться

Ramil Rizvanov
тут сам Страуструп велел ссылкой пользоваться

Очень рад за него. А если у нас отложенная инициализация поля unique_ptr в классе B?

Ramil Rizvanov
он создан чтобы объект жил пока жив умный указател...

Вы таким образом лишь архитектурную проблему маскируете в этом случае.

Ramil Rizvanov
тут сам Страуструп велел ссылкой пользоваться

ссылка мембер банит тебе дефолт и копи конструктор/операторы=

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Вопрос по WIN32: Насколько я понимаю то все функции win32 привязаны к объектам операционной системы. Например консоль, файл, кисть, окна итд. Следовательно функции win32 упра...
Tommy Vercetti
6
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
Hello, can I install macOS and run flutter on a virtual machine? Is it possible to print for iphone?
Mazones
11
Дороу! У кого-нибудь есть в загашнике проверенная функция экранирования, аналог re.escape в Python? Из доки: » Escape all the characters in pattern except ASCII letters and n...
Daniil Smolyakov
9
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
Народ поскажите хороший туториал как написать программу-службу Лазарем?
Alexander
6
Карта сайта