[英]Static vector of shared_ptr's for all the objects of a class hierachy
我有一個小類層次結構,並且我希望所有對象都具有指向該類層次結構中任何其他對象的指針。 因此,我決定將shared_ptr
的static vector
作為一個好主意。 更具體地說,我有一個具有protected
字段的類A
:
static std::vector< std::shared_ptr<A> > vector_of_objects;
構造函數中還包含以下行來填充向量:
vector_of_objects.emplace_back( this );
因此,該思想的主旨是:創建從A
繼承的任何類的對象時,它將調用基類構造函數並將指向其自身的指針指向靜態向量。
坦白地說,我不知道這是否有可能。 無論如何,在contructor的這一行中,我遇到了鏈接錯誤-對A::vector_of_objects
未定義引用。 我是否需要以某種方式預先初始化向量?
萬一我弄錯了,除了創建外部向量外,還有什么方法可以實現這個想法?
如果使用ODR,則static
數據成員不僅必須在類定義中聲明,而且還必須在一個轉換單元中定義。
附帶說明一下,您的靜態向量應該只存儲weak_ptr
,除非您真的想讓它們像永遠一樣活着(在這種情況下,原始指針就足夠了)。
此外,請查看您的基類的std::enable_shared_from_this
,如果它們確實全部由shared_ptr
管理。
不知道為什么需要這樣的結構,到目前為止,我的印象是您只需要一組對象(而不是std :: set)。 至於鏈接錯誤,您應該這樣定義您的靜態成員:
std::vector<std::shared_ptr<A>> A::vector_of_objects;
否則,您只是聲明了它,沒有定義。
使用完整代碼段進行更新:
#include <vector>
#include <memory>
class A {
public:
static std::vector<std::shared_ptr<A>> allObjects;
A() {
allObjects.emplace_back(this);
}
};
std::vector<std::shared_ptr<A>> A::allObjects;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.