在專案開發中,我需要一個鏈表結構。雖然 C++ 標準庫提供了 std::list,但為了深入理解模板機制、內存管理以及運算符重載等核心概念,我決定參考《數據結構、算法與應用——C++語言描述》及《Thinking in C++》等經典著作,自行實現一個簡單卻功能完整的鏈表模板類。這不僅解決了項目需求,更是一次極佳的 C++ 進階實戰練習。
初學者最容易踩的坑在於 LNK2001 鏈接錯誤。根據《Thinking in C++》第 16 章解釋:模板類在定義時不分配內存,僅在實例化時才生成具體代碼。因此,模板類的聲明與定義必須放在同一個頭文件中,否則編譯器無法在其他編譯單元看到定義而導致鏈接失敗。這也是為什麼本實現將所有成員函數(包括 CListData 和 CNode)均聲明為 inline 並寫在頭文件中的原因。
網上教程多以 int 為節點類型,實戰中遠不夠用。本實現提供一個完整的業務節點類 CNodeInfo,包含計數器、文件名、文件長度、傳輸狀態等字段,並提供完整的封裝接口:
class CNodeInfo {
private:
int m_Count; // 計數器/主鍵
CString m_strFileName; // 文件名
DWORD m_dwFileLen; // 文件長度
BOOL m_bStatus; // 傳輸狀態標記
public:
CNodeInfo(); ~CNodeInfo();
void SetStatus(BOOL bStatus = FALSE); BOOL GetStatus();
void SetFileLen(DWORD len); DWORD GetFileLen();
void SetFileName(CString str); CString GetFileName();
};
擴展建議:若需跨平台,可將 CString 替換為 std::string,BOOL 改為 bool,DWORD 改為 uint32_t。
本文參考《數據結構、算法與應用——C++語言描述》、《Thinking in C++》及網絡資料。完整源碼可在文末下載,包含測試用例與項目文件,可直接在 VC6/VS2005+ 環境下編譯運行。