要在有效狀態下創建B
對象,您不必再做任何事情。您甚至不必爲B
聲明和實現構造函數和析構函數。 std::vector<std::shared_ptr<A>>
是B
的成員將在B
的構造函數中默認初始化,這意味着它在容器中還沒有任何元素。由於std::vector
和std::shared_ptr
析構函數,它也將在~B
中正確刪除。
另一方面,如果你想例如初始化它(即,3值),您可以在B
的構造函數初始化列表中使用std::vector
的std::initializer_list
構造函數。例如:
class B
{
public:
B(): _innerArray{ std::make_shared<A>(),
std::make_shared<A>(),
std::make_shared<A>() } {}
~B() {}
private:
std::vector<std::shared_ptr<A>> _innerArray;
};
記住std::make_shared
使用完美轉發,所以你通過A
的構造函數的參數作爲函數的參數,而不是類對象本身。
回答您對設計的關注我想鼓勵您在決定分享之前首先考慮向量中成員的獨佔所有權。
class B
{
public:
B();
~B();
private:
std::vector<std::unique_ptr<A>> _innerArray;
};
以上實施方式在許多方面更爲有效。首先,它讓你的設計更清晰地說明誰是負責A
的使用壽命。 Next std::unique_ptr
更快,因爲它不需要線程安全引用計數。最後但並非最不重要的是它不會花費任何額外的內存(與普通的C指針相比),而std::shared_ptr
可能需要幾十個字節(24-48)來存儲共享狀態數據,這對於小型操作時非常無效。這就是爲什麼我總是使用std::unique_ptr
作爲我的第一款度假智能指針,而當它真的需要時,我只能退回到std::shared_ptr
。
編輯:
回答您的編輯我將創建的類A
,B
3個容器,C
。根據這一事實,如果你需要他們多態與否我將存儲一樣,要麼值(非多態類型):
std::deque<A> as;
std::deque<B> bs;
std::deque<C> cs;
或(多態類型):
std::vector<std::unique_ptr<A>> as;
std::vector<std::unique_ptr<B>> bs;
std::vector<std::unique_ptr<C>> cs;
的順序
(as
必須比bs
長,bs
必須長於cs
)。然後我只需裏面的B
類和std::vector<B*>
裏面的C
類沒有任何智能指針的使用。
我希望有幫助。
編輯:
在其允許的引用第一殼體改變std::vector
到std::deque
/指針容器元素生存容器與擴展push_back()
。然而,他們將無法生存擦除元素,排序或其他東西。
完美檢查:你需要指針嗎?如果是這樣,它應該是一個共享指針? –
B類應該有權訪問但不擁有其他地方存儲的某些對象。我沒有看到在這裏使用unique_ptr而不是shared_ptr,但我是智能指針的noob。 –
@Pavel你是對的:你的場景排除使用'unique_ptr',它強制使用指針。但是,如果'B'不應該擁有所有權,我甚至會考慮使用原始指針而不是共享指針。畢竟,後者表示共享所有權(但也許這就是你最終需要的)。 –