Здравствуйте, ViTech, Вы писали:
S>>Ведь у вас Engine останется жив до тех пор, пока в Monitor не умрет string-ссылка на Engine. А это есть ни что иное, как влияние на время жизни, т.е. то самое совместное владение, наличие которого вы никак не можете признать.
VT>Фокус в том, что именно такое поведение мне и нужно.
Фокус в том, что именно такое поведение вам и дает shared_ptr. И нет надобности в изобретении его аналогов с вводящими в заблуждение именами.
Если вы так уж хотите иметь именно "владеющий указатель", а не голый shared_ptr, то нет ничего сложного в создании обертки:
class UniqueEngine {
std::shared_ptr<Engine> engine_;
public:
UniqueEngine(const UniqueEngine &) = disable;
UniqueEngine(UniqueEngine &&) = default;
UniqueEngine(std::unique_ptr<Engine> en) : engine_(std::move(en)) {}
...
std::weak_ptr<Engine> weak_ref() { return {engine_}; }
...
};
...
class Car {
UniqueEngine engine_;
...
public:
auto engine() { return engine_.weak_ref(); }
};
class Monitor {
std::weak_ptr<Engine> engine_;
...
};
Но и это уже оверинжениринг какой-то.
Может вам вообще нужно просто что-то вроде:
class Car : public std::enable_shared_from_this {
Engine engine_;
public:
std::weak_ptr<Engine> engine() {
return { std::shared_ptr<Engine>(shared_from_this(), &engine) };
};
};
VT>Да, я хочу писать программы в соответствии с моделями UML.
Пишите. Только сперва разберитесь каким естественным образом понятия из UML ложатся на C++, а не придумывайте велосипеды.
VT>Если вам хватает функциональности std::shared_ptr, и не нужны всякие псевдоконцепции, то и ладно
Не видно объективных причин для того, чтобы придумывать еще что-то сверх того. И вы не можете привести убедительных доводов.