考慮以下父/子對象模型。父母和孩子的意圖是使用shared_ptr
來管理他們的一生。父母應保留shared_ptr
(保留)其子女,並且子女將保留weak_ptr
給父母。我應該如何構建一個用std :: shared_ptr進行管理的實例?
鑑於這些對象的意圖總是由std::shared_ptr
來管理,構建它們的最佳方式是什麼?我想到的方法(到目前爲止)感覺有點笨拙:我使用工廠(朋友)函數和一個私有構造函數來減少指向這些對象的原始指針「逃逸」的可能性。然後,孩子在ctor中創建shared_ptr
和this
,並將其放入父母的vector
兒童中。當ctor將原始指針返回到工廠函數時,工廠函數使用shared_from_this()
來獲得shared_ptr
,該shared_ptr
與子級的父代向量中的shared_ptr
「掛鉤到」(即共享引用計數)。
下面是我想出迄今:
class Child; // Forward decl
class Parent : std::enable_shared_from_this<Parent> {
public:
int value() const { return _value; };
void set_value(int newValue) { _value = newValue; };
std::vector<std::shared_ptr<const Child>> children() const {
// propagate const-ness to the child pointers we hand back.
return std::vector<std::shared_ptr<const Child>>(begin(_children), end(_children));
};
std::vector<std::shared_ptr<Child>> children() {
return _children;
};
private:
Parent(int value) : _value(value) {};
friend class Child; // So it can add itself to the _children vector
friend class std::shared_ptr<Parent>; // So that I don't have to inherit public from enable_shared_from_this
friend std::shared_ptr<Parent> CreateParent(int value); // So it can call the private ctor
std::vector<std::shared_ptr<Child>> _children;
int _value;
};
class Child : std::enable_shared_from_this<Child>
{
public:
int value() const { return _value; };
void set_value(int newValue) { _value = newValue; };
private:
Child(const std::shared_ptr<Parent>& parent, int value) : _parent(parent), _value(value) {
std::shared_ptr<Child> sp(this); // This feels wrong, but the existence of the shared_ptr in the parent's vector of children ensures that the precondition for calling shared_from_this() is met
parent->_children.push_back(sp);
};
friend std::shared_ptr<Child> CreateChild(const std::shared_ptr<Parent>& parent, int value); // So it cal call the private ctor
friend class std::shared_ptr<Child>; // So that I don't have to inherit public from enable_shared_from_this
std::weak_ptr<Parent> _parent;
int _value;
};
std::shared_ptr<Parent> CreateParent(int value) {
return std::shared_ptr<Parent>(new Parent(value));
};
std::shared_ptr<Child> CreateChild(const std::shared_ptr<Parent>& parent, int value) {
std::shared_ptr<Child> rv = (new Child(parent, value))->shared_from_this();
return rv;
};
這似乎是工作,而人,是什麼感覺笨重。有沒有更好的辦法?
您可以跳過您嘗試解決的原始問題的詳細信息。爲什麼生指針會「逃跑」?這是您試圖解決的「社會」合同/限制嗎? – mockinterface
我試圖解決的原始問題是我對智能指針的最佳實踐缺乏透徹理解。是的,這個例子很有意思,但這是故意的。 – ipmcc
哦。這只是一個我詢問時代碼的狀態。該創建者可能也是一個靜態成員函數。我只是偏愛自由職能,就這些。我想重申/縮小我的困惑:在Child的情況下,感覺就像我在Ctor和工廠方法中「分割」共享指針的創建一樣。另一方面,家長很清楚,在一個地方,因爲沒有其他共享所有權。這種分裂感覺很笨重。 – ipmcc