C++ 入門指南 V2.00 - 單元 29 - 整合 Encrypt




想要在 EncryptWindow 中使用 Encrypt 類別 (class) ,就得將 encrypt.cpp 加入 encrypt_gui 專案 (project) 之中



我們這裡介紹在 Qt Creator 中新增類別檔案的方式,點擊選單〔檔案〕的〔新增檔案或專案(N)...〕



就會出現「新增」視窗,我們選擇「檔案與類別」中 C++C++ Class ,然後點擊右下角的〔Choose...〕



接著輸入類別名稱 Encrypt ,自動產生兩個檔名 encrypt.hencrypt.cpp ,然後點擊右下角的〔繼續〕



最後出現「專案管理」,這裡點擊右下角的〔完成〕即可



結束類別精靈後,我們可以看到 Qt Creator 中已經增加了 encrypt.hencrypt.cpp 兩個檔案,檔案內容則是預設的類別、建構函數 (constructor) 的宣告



就把原本發展好的 encrypt.hencrypt.cpp 複製貼上吧!



接下來開始整合的工作囉!首先,我們在要 EncryptWindow 中使用 Encrypt 的功能,就得增加一個 Encrypt 型態 (type) 的資料成員 (data member) ,如下


038 // 解碼核心
039 Encrypt *e;

完整程式請參考 encryptwindow.h

建構函數的部份,我們在初值串列 (initializer list) 的地方將 e 的初值設定為 NULL ,這是 C++ 中特定的巨集 (macro) ,表示什麼都沒有的指標 (pointer)


008 // 建構函數
009 EncryptWindow::EncryptWindow(QWidget *parent) :
010    QMainWindow(parent),
011    ui(new Ui::EncryptWindow),
012    e(NULL)
013 {
014    ui->setupUi(this);
015 }

完整程式請參考 encryptwindow.cpp

C++11 新增一個關鍵字 (keyword) nullptr 等同 NULL 的用法。

現在來改寫 on_pushButton_new_clicked() 函數,這也是點擊 New 按鈕後的動作,如下


034 // 按下 New 按鈕的事件
035 void EncryptWindow::on_pushButton_new_clicked()
036 {
037    e = new Encrypt();
038    ui->label_display->setText(e->get_code_array());
039 }

這是實際用關鍵字 new 建立 Encrypt 資料成員 e ,然後在 label_display 顯示密碼表。


好了,按下左下方的執行鍵實際測試看看囉!



咦?沒有編譯成功,警告標誌停在


038 ui->label_display->setText(e->get_code_array());

這裡編譯失敗,提示訊息告訴我們這裡不允許 string 轉換成 QString ,這是個型態不相符的問題,接下來我們要稍微停止開發的腳步,仔細討論一下這個問題說。


中英文術語對照


類別 class
專案 project
建構函數 constructor
型態 type
資料成員 data member
初值串列 initializer list
巨集 macro
指標 pointer
關鍵字 keyword

重點整理


  1. encrypt_gui 專案要使用 Encrypt ,就得加入 encrypt.hencrypt.cpp
  2. EncryptWindow 整合 Encrypt 類別的方式為增加一個 Encrypt 型態的資料成員 e
  3. e 的初值設定為 NULL ,這是 C++ 中特定的巨集,表示什麼都沒有的指標。
  4. e 實際上在 on_pushButton_new_clicked() 建立,這是跟 New 按鈕連動的成員函數。

問題與討論


  1. 為什麼 EncryptWindow 中的資料成員 e 要宣告成指標?
  2. 為什麼 stringQString 不能直接互相轉換?那 Qt 中的雙引號是字元陣列還是 QString

練習


  1. 承接上個單元的 guess_game 專案,整合單元 26 練習 exercise2601.hGuessGame 類別,並在 GameWindow 類別中宣告 GuessGame 型態的資料成員 g
  2. 承上題,實作 New Game 按鈕,並在下方的 Text Browser 顯示遊戲開始的提示訊息。

the end

沒有留言: