2009-10-19 60 views
-1
template <class T> 
    class container 
    { 
     typedef list<T> ObjectList; 
public: 
    ~container() 
    { 
     for (typename ObjectList::iterator item = _Container.begin(); item != _Container.end(); item++) 
     { 
     if (*item) 
     delete (*item) 
     } 
    } 
    } 

我如何可以自由通過刪除指針內容的容器項目? G ++不允許這種代碼模板化的STL容器

+10

後。一些。真實。碼。 – dirkgently

+0

這裏有一些簡單的編譯錯誤。請在解決簡單的錯誤後重新發布您的問題(如果您還有問題)。 – resolveaswontfix

+0

_Container,你在哪裏定義了這個? – Satbir

回答

0

你不想這樣做 - 容器(鏈表類,你的情況)擁有它所包含的項目,所以刪除它們,你需要告訴它你想要的東西,如: ObjectList.erase(item);。既然你(顯然)刪除了所有的項目,你也可以使用:ObjectList.clear();並跳過使用你的顯式循環。

然後再次,因爲ObjectList顯然是一個std :: list,所以你不需要做任何上面的事情 - 當你銷燬一個std :: list時,它會自動銷燬它包含的任何對象。

編輯:(主要是爲了響應UncleBens的評論):如果你想創建一個指針的容器來管理它所包含的指針所指向的項的刪除,那麼你要做的第一件事是確保它真的包含指針:

template <class T> 
class container { 
    typedef typename std::list<T>::iterator it; 
    std::list<T *> items; // Note 'T *' rather than just "T" 
public: 
    ~container() { 
     for (it p=items.begin; it!=items.end(); ++it) 
      delete *it;  // *it yields a pointer from the container.  
    }  
}; 
+0

我假設OP有一些像boost.ptr_containers在腦海中(儘管很難從問題中分辨出來)。有一個容器,刪除包含指針是一個完美的猶太人擁有的東西。 – UncleBens

3

讓我們來看看:

  1. _Container從未聲明。

  2. delete(*item)需要一個分號。

  3. 你不需要delete之前測試的指針荷蘭國際集團 - 你可以刪除0

  4. 你一定要確保T爲指針類型。

  5. 不要使用像這樣的原始指針 - 最好使用一些好的智能指針。

1

你不知道。

template<typename T> 
class container { 
    typedef list<T> list_t; 
    list_t container_; 
    // no user-defined destructor needed 
}; 

成員「container_」自己管理其元素。

但是,如果要存儲指向動態分配對象的指針並讓容器取得「所有權」(負責刪除),則可以遍歷列表並調用每個元素上的刪除。但是,您還需要考慮將此容器對象複製或分配給另一個容器對象時應該發生的情況!副本將共享相同的pointees,並且某些元素可能會被刪除兩次!

順便說一句:你不應該使用以下劃線開頭的名字。這些名字是保留的。

+0

我認爲_container可能會有問題,但_Container不會。不確定 –

+1

反過來:任何以兩個下劃線或只有一個下劃線和大寫字母開頭的內容都是您不應該使用的保留名稱。 – sellibitze

+0

閱讀本命名的限制:(什麼 - 是最規則有關,使用-的下劃線,在-AC-標識符)[http://stackoverflow.com/questions/228783/what-are-the-rules - 使用下劃線在ac標識符/ 228797#228797] –

0
  • 有錯字錯誤
  • 您要刪除這是不是指針

希望這將爲你工作!

template <class T> 
class container 
{ 

public: 
    typedef list<T*> ObjectList; 
    ~container() 
    { 
     for (ObjectList::iterator item = _Container.begin(); item != _Container.end(); item++) 
     { 
      if (*item) 
       delete (*item); 
     } 
    } 
    ObjectList _Container; 
}; 
+0

隱式生成的副本c'tor和賦值運算符怎麼樣? – sellibitze

+1

請仔細閱讀本:http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 _container由OS保留使用。如果操作系統構建者決定將這個名稱的宏添加到標準頭文件中,它會弄亂你的代碼。 –

+0

刪除前無需檢查空值。 – GManNickG

0

它不是立即清楚你想實現什麼,但如果你想創建一個存儲指針對象(而不是存儲對象本身)的容器,然後更好的技術將是創建一個智能指針的容器(具體類型的智能指針取決於你的意圖)。這會自動處理對象生命週期管理。

3

不要試圖自己做這件事,並使用Boost Pointer Container

+0

必須通過岩石路徑才能到達天堂。 – lsalamon

+0

被稱爲C++的岩石的路徑已經旅行了很多次。最好堅持走,不要漫步它。 –

+0

我同意你應該懷疑這條路。被歹徒捱打致死,然後比較你做錯了什麼與助推。這樣你學到了新的東西。但在你休息之前,明白這是一個解決的問題。 –