達步社群專業網站 達步社群 (Dabutek Community)

RSS

社區設施





快速搜尋
»
進階搜尋» 技術支援官網
   
 

Table of Contents [Hide/Show]


      學習背景
      IDE選擇
      物件封裝
      STL集合
      文章結論

作者: Tomex Ou
版本歷史:
2008/6/24 PM 01:52:25 學習心得初稿。

學習背景

筆者雖然讀資訊管理科系(商科),大學四年卻對C/C++語言無法領會,抱了本C++指南書四年腦袋仍是空洞,最後沉迷於FTP架站/收集的喜悅。當兵後第一份工作就是從事系統管理路線,整天跟Sales出外混所學有限,學習到的系統設定經驗總是被新的系統版本或設備所輕易取代,因此1週內我就決定要走程式設計之路。

商科資管的背景,肯定剛開始進入程式領域是資料庫及網頁程式,學了挺多雜亂的程式技巧。後來在研究所接觸Java及C#,對於物件導件及函式庫封裝比較有興趣,高階編程轉向中階偏上,後來到一家工業電腦公司當軟體研發RD,開始接觸當初怎學都學不會的C++,因為是開發影像應用程式,所以使用BCB6,因為VC6命名難學且生產力薄弱(在AP/UI方面)。

後來幫忙公司寫一些內部管理系統,回歸至C#.NET,最近因為要寫CPU/BIOS的偵測程式,因此回歸至遺忘已久的C++,因為BCB6的VCL文件總是不更新,加上Borland已轉賣該IDE部門,而學習VC6又學不下去(太亂且起步晚),因此選擇GNU C++標準開發方式,希望也能藉機跨linux程式領域。

IDE選擇

相較於C#而言,GNU C++沒有VC6/BCB6的函式庫及良好開發環境,所以選擇一套有前途的IDE,肯定對學習之路有幫助。我評估了Eclipse CDTCode Blocks,理論上前者有Java當靠山且Eclipse的開發環境真的不錯,但試用了一下沒有語法提示且除錯困難(發展很慢),因此選擇Code Block,因為它在linux能輕易安裝,編輯速度比Eclipse快,而且作者每天Nightly Build,似乎狂熱地維護著(都沒正職工作嗎?),所以我選擇了它。

下載含有GCC compiler/GDB debugger/MinGW的完整版,選擇完整安裝。它的界面很不錯,有語法提示(非常重要)及逐步debug除錯:
Image

物件封裝

雖然未接觸到GNU C++標準函式庫,但相關的C++語法及指標的應用,我已有一定的經驗,加上BCB6及C#的物件開發經驗,我清楚知道哪一些函式庫是我必須先測試滿足的。C/C++初學者常常照著書打Hello World就淺嚐則止,大學時代的我就是毀在這一點,因此這次開始學習GNU C++前就先方向定位,不寫UI(因為肯定寫輸C#),避免被陽春的語法而打擊信心。

首先,建立C++的標準類別封裝Sample(*.cpp/*.hpp),程式封裝成物件能簡化編程上的思維,這是我的堅持及執著,否則一大堆不相干的function擺在一起,久了都不知道它們的關係。
Image

高階物件語言都有Property屬性,但原生C++並沒有,因為它實在很方便(封裝上的優美),我參考網路文章「Implementing a Property in C++」實作了如上圖21-24行的Property宣告。

用Template實作Property的源碼,語法挺不直觀的,改了一些命名風格:
Image

仿BCB6風格的*.cpp內文:
Image

STL集合

接下來,我知道類似C#的泛形集合(Generic Collection)在實務上很常用,封裝好的物件集合,用array[]固定Size會很辛苦,因此找了類似C#中List的C++ STL函式庫vector實作測試一下,過程中當然有點巔簸,因為相較c#而言,忘了一個*指標就錯誤,而且得記得要delete配置的記憶體。

以下是我用vector集合自訂物件的程式範例:
Image

驗證測試過程裏,我儘量用「容忍之心」對待這陽春易犯錯的語法,畢竟用慣了C#等高階語言,寫這些實在是有點吐血。著名的C++函式庫boost就是要減少這樣的問題,目前我尚未導入使用,因此先不花時間詳看STL庫的實作及用法定義。

程式輸出結果:
Image

文章結論

以上GUN C++的學習之路及成果,大概花了我一個上午的時間,所幸寫出來的Code也挺有實務上的架構,絕非Hello World所能比擬。接下來我會去使用別人既有的函式庫(boost)來加速C++開發,最後才會去真正用C++語言去實作我的工作內容。我做事或學習比較重視基本功,武器沒有確定磨利熟悉之前,絕不輕易出手。

ScrewTurn Wiki version 3.0.5.600. Some of the icons created by FamFamFam.