我有一個類用於創建鏈接對象集。 「鏈接」以這樣的方式執行,即給定集合的每個對象的指針指向該類的一個相同對象(從現在起將被稱爲「頭部」)。因此,當訪問該集合的對象時,它將訪問頭部,並因此訪問包含在頭部中的頭部(一種鏈接列表,但是其中所有對象鏈接到單個對象,而不是鏈接到下一個列表中)。從指出的對象本身釋放高效指針
類看起來是這樣的:
template <typename T> class Myclass;
template <typename T>
class Myclass
{
Myclass<T>* link;
shared_ptr<T> data_;
int count_;
Myclass<T>* rep()
{
if(link==0x00) return this;
else
{
Myclass* ret = link->rep();
return link = ret;
}
}
public:
Myclass()
: link(0x00)
, count_(1)
{}
explicit Myclass(const shared_ptr<T>& data)
: link(0x00)
, data_(data)
, count_(1)
{}
(...more functions)
void add(Myclass<T>& rv)
{
if(*this == rv) return;
rv.data() = shared_ptr<T>();
rep()->count_ += rv.empty() ? 1 : rv.count();
rv.count_ = 0;
rv.rep()->link = rep();
}
shared_ptr<T>& data()
{
return rep()->data_;
}
}
時Myclass
對象由構造explicit Myclass(const shared_ptr<T>& data)
調用,data_
充滿const shared_ptr<T>& data
創建一個「頭」。方法add()
通過將Myclass
的對象鏈接到集合的頭部來將一個對象Myclass
添加到集合中。 「鏈接」實際上由rep()
完成,如代碼中所示。該課程的任何公共職能都通過rep()
來完成,如data()
。因此,我可以從一個集合的任何對象訪問data_
。
事情是,當處理代碼中某處的一組Myclass
的一個對象時,我可能需要分解該組。爲了打破我設定的所有對象從頭部脫落的意圖(即,變量link
不再指向頭部)並且頭部的data_
被釋放(所以它不再是頭部了) )。這裏的挫折是我只能訪問我正在處理的對象和頭部(通過rep()
)。
當我只能訪問該集合中的一個對象時,如何執行此分解?
我想出的唯一想法是在類中創建另一個變量,一個指針向量Myclass<T>*
。每當一個對象被添加到一個集合時,頭部的向量就會增加一個指向這個全新對象的指針。所以,當我想「解散」一套時,我只需要通過這些指針將每個對象的變量link
修復爲0x00
。但是,我非常確定它必須是其他更優雅和最優化的方式才能做到這一點。
任何想法都會受到歡迎。希望我已經清楚地解釋了我的問題。
爲什麼你用這種方式表示對象?它有什麼優點? –
我不知道你試圖創建什麼樣的數據結構。你說它有點像鏈表,但是有什麼區別? – rwols
你的問題不清楚,但你的所有權語義看起來不完整。你應該考慮將'link'聲明爲'std :: weak_ptr',否則你可能會遇到循環引用的問題。 –