2013-05-30 59 views
0

我有一個類用於創建鏈接對象集。 「鏈接」以這樣的方式執行,即給定集合的每個對象的指針指向該類的一個相同對象(從現在起將被稱爲「頭部」)。因此,當訪問該集合的對象時,它將訪問頭部,並因此訪問包含在頭部中的頭部(一種鏈接列表,但是其中所有對象鏈接到單個對象,而不是鏈接到下一個列表中)。從指出的對象本身釋放高效指針

類看起來是這樣的:

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。但是,我非常確定它必須是其他更優雅和最優化的方式才能做到這一點。

任何想法都會受到歡迎。希望我已經清楚地解釋了我的問題。

+1

爲什麼你用這種方式表示對象?它有什麼優點? –

+0

我不知道你試圖創建什麼樣的數據結構。你說它有點像鏈表,但是有什麼區別? – rwols

+0

你的問題不清楚,但你的所有權語義看起來不完整。你應該考慮將'link'聲明爲'std :: weak_ptr',否則你可能會遇到循環引用的問題。 –

回答

1

如果我完全理解你的問題,你應該能夠用智能指針(比如C++ 11的shared_ptr和相關類)做到最安全和最簡單。

+0

對不起,但我無法弄清楚如何在這裏使用智能指針。也許通過使用'intrusive_ptr',它保持對象的引用計數?無論如何,一個智能指針並不能解決從頭部解除集合對象的問題,是嗎?你能發展你的答案嗎?謝謝! – capstain