一個(gè)簡(jiǎn)單的鏈表模版類(lèi)的實(shí)現(xiàn)
作者:Smoke
源代碼下載
這是翻閱《數(shù)據(jù)結(jié)構(gòu)、算法與應(yīng)用——C++語(yǔ)言描述》 以及在網(wǎng)上得到的一些資料后寫(xiě)出來(lái)的。起因是在項(xiàng)目中要用到一個(gè)鏈表,但我做一個(gè)簡(jiǎn)單的鏈表在C++中用的時(shí)候跟C差別很多,比如賦值運(yùn)算(編譯器說(shuō)要做操作符重載,或者考貝構(gòu)造函數(shù),C++中把結(jié)構(gòu)當(dāng)成一個(gè)類(lèi)來(lái)看了,詳見(jiàn)相關(guān)介紹的文檔或書(shū)籍)。后來(lái)一想干脆做個(gè)template順便學(xué)習(xí)一下,一舉兩得。
幾個(gè)問(wèn)題:
CListData和CNode的函數(shù)均為內(nèi)聯(lián)函數(shù)(inline),因?yàn)槟壳暗木幾g器仍不支持分離編譯。按《Thinking in C++》一書(shū)第16章中的解釋是,模版類(lèi)在定義的時(shí)候并沒(méi)有對(duì)內(nèi)存進(jìn)行分配置,而是到實(shí)例化的情況下才分配內(nèi)存,因此可以把聲明和定義都寫(xiě)在頭文件(詳見(jiàn)原文)。
因此,如果將兩個(gè)文件分離則在連接時(shí)報(bào)錯(cuò)LNK2001。(這問(wèn)題把我搞得痛苦了好一陣)
在網(wǎng)上及書(shū)上的例程中通常是以一個(gè)int做為例子,這使得在我們應(yīng)用的時(shí)候很不方便,特別是在不完全理解template的時(shí)候。在這里我以一個(gè)類(lèi)(CNodeInfo)作一個(gè)節(jié)點(diǎn)類(lèi)型的例子。
代碼:
class CNodeInfo{private: int m_Count;//Counter or call it PKEY:) CString m_strFileName;//for Store filename DWORD m_dwFileLen;//for store file length BOOL m_bStatus;//Transfers status tag;public: CNodeInfo(); ~CNodeInfo(); void SetStatus(BOOL bStatus = FALSE); BOOL GetStatus(); void SetFileLen(DWORD len); DWORD GetFileLen(); void SetFileName(CString str); CString GetFileName();};//private 為數(shù)大家可以理解成結(jié)構(gòu)中的元素如:typedef struct _FILESTRUCT_{ int count; CString strFileName; DWORD dwFIleLen BOOL bStatus;}FILESTRUCTURE.
聯(lián)系客服