首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

VC++ 類別間互相呼叫:成員函式存取與指標管理

     編輯:關於C語言

MFC 專案中,一個對話方塊/視圖類別呼叫另一個對話方塊類別的公開函式,是模組化設計的基礎操作。本文說明兩種常見方式——**物件實例法**與**指標動態建立法**——的語法、生命週期管理與適用場景。

前置條件

  • 被呼叫函式必須宣告為 public。
  • 包含被呼叫類別的頭檔(#include "Dialog2.h")。

方式一:區域物件實例(棧上建立,自動銷毀)


void CMainDlg::OnCallDialog2() {
    CDialog2 dlg2;          // 棧上建構
    dlg2.Show();            // 呼叫公開函式
    // dlg2 於此處離開作用域,自動呼叫解構函式
}
  • ✅ 簡潔、無記憶體洩漏風險、例外安全(RAII)。
  • ✅ 適合模態對話方塊(DoModal())或短生命週期操作。
  • ❌ 若需跨函式持有狀態(如非模態對話方塊長期顯示),不可用。

方式二:動態配置指標(堆上建立,手動管理)


void CMainDlg::OnCreateModeless() {
    m_pDlg2 = new CDialog2();   // 成員指標 CDialog2* m_pDlg2;
    m_pDlg2->Create(IDD_DIALOG2, this);
    m_pDlg2->ShowWindow(SW_SHOW);
}
// 某處銷毀(如主視窗關閉、按鈕事件)
void CMainDlg::OnDestroyModeless() {
    if (m_pDlg2) {
        m_pDlg2->DestroyWindow();
        delete m_pDlg2;
        m_pDlg2 = nullptr;
    }
}
  • ✅ 物件生命週期可跨越多個函式、持續顯示非模態視窗。
  • ⚠️ **必須手動 delete**,否則記憶體洩漏。
  • ⚠️ 例外拋出時若未捕獲釋放會洩漏,建議改用智慧指標:std::unique_ptr m_pDlg2; (C++11)。

進階:模態與非模態差異

類型建立方式呼叫阻塞典型用途
模態dlg.DoModal()是(回傳 IDOK/IDCANCEL)設定對話框、確認提示
非模態dlg.Create() + ShowWindow()否(立即返回)工具視窗、即時監控面板

最佳實踐建議

  1. 優先使用棧上物件 + DoModal() 處理短暫互動。
  2. 非模態視窗使用成員智慧指標 std::unique_ptr 管理生命週期。
  3. 避免循環包含:若 A.h 包含 B.h,B.h 又需用到 A*,請在 B.h **前向宣告** class A;,並在 B.cpp 包含 A.h。
  4. 跨模組呼叫(DLL 介面)請定義純虛擬介面類別,避免匯出 C++ 類別導致二進位相容性問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved