А почему не в конструкторе передавать?
Нет Shared ptr не нужен
делают, но это скорее обязательная зависимость, так что инъекция через метод выглядит странно немного)
Сильное утверждение
В 99% случаев*
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  а если потом надо будет заменить двигатель?
потом замените, но в конструкторе хорошо бы хоть какой-то наверное затребовать
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  но плодить методы SetEngine это норма? как вообще принято? я знаю как в Java, знаю как в C#, но в плюсах никак не разберу
Это не норма даже в джаве и шарпе
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Почему? Инкапсуляция же
Потому что чем иммутабельнее объект, тем лучше
Ну так то оно так
Ну Геттеры как раз его делают менее мутабельным
это вы языком тогда ошиблись
Ты хочешь у машины на лету менять движок?
Для всяких DTO это норм, но в плюсах это просто структуры плоские
А сеттеры — более мутабельнее :)
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  машина движок лишь пример)
Если владелец один, то зачем shared_ptr, а не unique?
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  потому что фабрика может ссылаться на этот двигатель
может ссылаться, это ещё не значит, что владеть
Короче, shared_ptr надо использовать только там, где имеет место быть общее владение одним объектом несколькими другими. Иначе надо использовать unique_ptr
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  так я же пишу, машина ссылается на двигатель, фабрика который сделала двигатель ссылается на двигатель
Вы не понимаете что такое владение
> фабрика который сделала двигатель ссылается на двигатель Зачем
а кто владеет двиагетелем? кто его уничтожает и создаёт?
Так у вас не ссылается, а владеет. Такое ощущение, что на одном двигателе может несколько машин уехать
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  это субъективно, шаред это прежде всего умный указатель
Как и unique_ptr; почему вы выбрали shared?
Это не субъективно Это best practice в С++, которая сложилась за 10 лет
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  машина может быть уничтожена, но информация о двигателе у фабрики двигателей должна быть
Двигатель и информация о двигателе — это разные сущности
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  дайте ссылку бест практисов где 99% шареды зло
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  от архитектуры зависит
Это звучит потрясающе странно Пусть фабрика владеет, раз двигатели в ней живут
Не зависит
в вашем примере шаред не нужен. он нужен, например, если у вас есть фабрика ресурсов (текстур, звуков и т.д.) и есть куча объектов, которые используют эти ресурсы. вы хотите, что бы ресурс был аллоцирован, пока есть пользователи этих объектов. в этом случае shared_ptr может пригодиться
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  ну я не отрицаю что тут и юник подойдет, достаточно уик держать в фабрике, и при уничтожении машины двигатель обратно передать в фабрику например
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
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  пример был выдуман, путь и не очень удачно
если при уничтожении машины, двигатель не уничтожается, то машина им не владеет, а "арендует". в этом случае достаточно использовать в машине обычный голый указатель.
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Because of this it is more efficient than the shared_ptr ещё раз говорю, что я соединяю макро компоненты, тут влияние шаредов на производительность - ничтожна
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  говорят, если вы не на низком уровне, то голые указатели лучше не трогать
Проблема не только в производительности Код сложнее читать потому что "всё владеет всем" — это ужасно
Ну вот же 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.
не совсем так. их не стоит выделять и удалять самому. но работать с ними можно
shared_ptr нужен не для того, чтобы пользоваться им, когда лень думать о владении
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  и словить УБ... когда-нибудь
причём тут UB?
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  но и так тоже можно)
В плюсах нельзя не думать о владении
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  когда под сырым указателем не будет валидного объекта
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Нет, это заблуждение. Не трогать лучше new/delete, это разные вещи
 Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  а если объект уже кто-то удалил? тот же умный указатель?
shared ptr создан не для этого
 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
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Ramil
                          Rizvanov
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  тут сам Страуструп велел ссылкой пользоваться
Очень рад за него. А если у нас отложенная инициализация поля unique_ptr в классе B?
Вы таким образом лишь архитектурную проблему маскируете в этом случае.
И в A есть условный SetObserver(observer* ptr)
ссылка мембер банит тебе дефолт и копи конструктор/операторы=
Не копи, а мув же
Обсуждают сегодня