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

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

71 ответов

28 просмотров

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

Нет 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
тут сам Страуструп велел ссылкой пользоваться

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта