C++ 入門指南

單元 29 - 整合 Encrypt

本書已有新版,請參考 C++ 入門指南 4.01 - 單元 29 - 整合 Encrypt

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

Encrypt → encrypt_gui

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

-qt_integreted01-

就會出現「加入專案或檔案」的視窗,我們選擇「檔案與類別」中 C++C++ Class ,然後點擊右下角的 Choose

-qt_integreted02-

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

-qt_integreted03-

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

-qt_integreted04-

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

-qt_integreted05-

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

-qt_integreted06-

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

// 解碼核心
Encrypt *e;

完整程式請參考 encryptwindow.h

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

// 建構函數
EncryptWindow::EncryptWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::EncryptWindow),
    e(nullptr)
{
    ui->setupUi(this);
}

完整程式請參考 encryptwindow.cpp

nullptr 等同標準程式庫中巨集 NULL 的用法。

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

// 按下「新建」按鈕的事件
void EncryptWindow::on_pushButton_new_clicked()
{
    e = new Encrypt();
    ui->label_display->setText(e->get_code_array());
}

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

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

-qt_integreted07-

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

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 顯示遊戲開始的提示訊息。

上一頁 單元 28 - 跳到信號槽
回 C++ 入門指南目錄
下一頁 單元 30 - QString 的問題
回 C++ 教材
回程式語言教材首頁