Понять, что ты shared_ptr и вернуть shared себя?
От: пффф  
Дата: 29.03.24 18:30
Оценка:
Привет!

Есть IDoSomething.
Есть IDoSomethingFactory:
struct IDoSomethingFactory
{
    virtual std::shared_ptr<IDoSomething> getDoSomething(SomeKind someKind) = 0;
};


В клиентском коде есть std::shared_ptr<IDoSomethingFactory> pFactory, через него вызываем pFactory->getDoSomething(someKind).

Хочу
а) реализовать IDoSomethingFactory и IDoSomething в одном классе реализации. Хочу волшебным образом получить shared_ptr, через который был вызван метод, и вернуть его. Есть такое волшебство? Современные плюсики могучи, не удивлюсь, что такое есть, хотя это всё и выглядит необычно.
б) можно сделать отдельно IDoSomething и хранить шаред в IDoSomethingFactoryImpl и возвращать его. Видимо, так и придётся делать
в) Хочу иметь общие для IDoSomethingFactory и IDoSomething данные в одном месте. Можно конечно разбить на класс "настроек", класс IDoSomethingImpl, и на IDoSomethingFactoryImpl, при этом IDoSomethingFactoryImpl и IDoSomethingImpl будут хранить shared_ptr<ISomethingSettings>. Видимо, так и придётся делать

В COM подобное можно провернуть, а на чистых плюсиках?
Re: Понять, что ты shared_ptr и вернуть shared себя?
От: vopl Россия  
Дата: 29.03.24 18:34
Оценка: +1
Здравствуйте, пффф, Вы писали:

П>Привет!


П>Есть IDoSomething.

П>Есть IDoSomethingFactory:
П>
П>struct IDoSomethingFactory
П>{
П>    virtual std::shared_ptr<IDoSomething> getDoSomething(SomeKind someKind) = 0;
П>};
П>


П>В клиентском коде есть std::shared_ptr<IDoSomethingFactory> pFactory, через него вызываем pFactory->getDoSomething(someKind).


П>Хочу

П>а) реализовать IDoSomethingFactory и IDoSomething в одном классе реализации. Хочу волшебным образом получить shared_ptr, через который был вызван метод, и вернуть его. Есть такое волшебство? Современные плюсики могучи, не удивлюсь, что такое есть, хотя это всё и выглядит необычно.

https://en.cppreference.com/w/cpp/memory/enable_shared_from_this
Re[2]: Понять, что ты shared_ptr и вернуть shared себя?
От: пффф  
Дата: 30.03.24 19:00
Оценка:
Здравствуйте, vopl, Вы писали:

V>https://en.cppreference.com/w/cpp/memory/enable_shared_from_this


Круто. И все эти shared_ptr, которые созданы снаружи и from this — они один счетчик используют? А как такое волшебство реализовано?

ЗЫ Пригляделся, там от него наследоваться надо
Re[3]: Понять, что ты shared_ptr и вернуть shared себя?
От: vopl Россия  
Дата: 30.03.24 19:15
Оценка:
Здравствуйте, пффф, Вы писали:

П>Здравствуйте, vopl, Вы писали:


V>>https://en.cppreference.com/w/cpp/memory/enable_shared_from_this


П>Круто. И все эти shared_ptr, которые созданы снаружи и from this — они один счетчик используют? А как такое волшебство реализовано?


При штатном использовании счетчик гарантированно один, там по ссылке смотри секцию Notes, довольно подробно описывается механизм, как оно устроено. Если двумя словами — внутрь этого класса, от которого надо отнаследоваться, помещается слабый указатель (и соответсвующим образом автоматически обслуживается), из которого и можно получить новый сильный указатель изнутри.

П>ЗЫ Пригляделся, там от него наследоваться надо


Ага
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.