2009-12-26 204 views
1

我想使用C++模板製作一個通用堆棧。堆棧推送方法的原型由以下公式給出: Void push(t * ptr) 其中,t是模板參數。現在指針ptr可能指向一個整數或整數數組,它可能指向單個字符或字符數組,它可能指向單個雙數或雙精度數組等。 我想要的是,我想要在push方法中分配內存,如果ptr指向一個整數,那麼我需要分配內存相對於整數的大小,如果ptr指向整數數組,然後我需要根據大小分配內存陣列。同樣對於其他基本數據類型 我的問題是如何確定這個pointe ptr是指向一個數組還是一個簡單的變量。如果不可能發現指針指向一個數組或一個簡單的變量,則建議一種技術,通過該技術我可以編寫該堆棧的推送方法。字符堆棧,字符串堆棧,整數堆棧,整數數組堆棧等

+0

你想讓你的堆棧包含推送它的副本嗎?或者將獲得傳遞給它的指針的所有權? – 2009-12-26 19:38:45

+0

是的是的確切 – 2009-12-26 20:12:53

+0

我想在堆棧中有東西的副本 – 2009-12-26 20:16:33

回答

0

一旦數組「衰減」到一個指針,就不可能推導出一個T *所指向的數組的大小。

考慮讓你的棧類型取一對指針,一個指向數組中的第一個元素,另一個指向數組中的最後一個元素。或者,有一個重載的push方法 - 一個採用單個指針,另一個採用單個指針和size_t告訴你指向了多少個對象。

而我有點困惑,爲什麼你有一個T *作爲參數。爲什麼不採取T,就像對stl容器上的大多數「添加」操作一樣?當你在這裏時,你知道std :: stack存在嗎(它是stl中的「容器適配器」)?即使你有很好的理由來重新實現它,尋找STL的API設計實例也是一個好主意。

2

你提出的建議不是一個好主意 - 它不可能在C++中檢測指針是指向單個實例還是數組,但是這兩者需要區別對待。

就個人而言,我會使用屬於C++標準的std :: stack適配器。

0

您的編譯器已經負責分配和複製。如果你像這樣定義推送:

push(T item) 

編譯器會爲你複製項目,你可以將它填充到你的內部存儲中。

另外,int和int []是兩個不同的類型。如果你想專門做一個堆棧可以接受的T [],你可以做推過載:

push(T[] items) 

我假設你想要這個功能,這樣就可以作爲單獨的項目推這些壓入堆棧,不是因爲你想要一個異構容器。在這個推動中,您可以遍歷數組中的每個項目並將其存儲到內部存儲中。

0

您可以使用模板的偏特喜歡這個數組的堆棧:

template <typename T> 
class Stack <T*> 
{ 
//other stuff 
}; 

但我不知道你的編譯器支持與否,因爲部分模板特化在VC++ 7.0不支持,以後的版本可能有它的支持。

我盡我所知linux gnu 8.2 GNU C++支持它。