Привет!
Есть 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 подобное можно провернуть, а на чистых плюсиках?
Здравствуйте, пффф, Вы писали:
П>Привет!
П>Есть 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
Здравствуйте, vopl, Вы писали:
V>https://en.cppreference.com/w/cpp/memory/enable_shared_from_this
Круто. И все эти shared_ptr, которые созданы снаружи и from this — они один счетчик используют? А как такое волшебство реализовано?
ЗЫ Пригляделся, там от него наследоваться надо
Здравствуйте, пффф, Вы писали:
П>Здравствуйте, vopl, Вы писали:
V>>https://en.cppreference.com/w/cpp/memory/enable_shared_from_this
П>Круто. И все эти shared_ptr, которые созданы снаружи и from this — они один счетчик используют? А как такое волшебство реализовано?
При штатном использовании счетчик гарантированно один, там по ссылке смотри секцию Notes, довольно подробно описывается механизм, как оно устроено. Если двумя словами — внутрь этого класса, от которого надо отнаследоваться, помещается слабый указатель (и соответсвующим образом автоматически обслуживается), из которого и можно получить новый сильный указатель изнутри.
П>ЗЫ Пригляделся, там от него наследоваться надо
Ага