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

C++ 句柄類模式:利用不完整類型減少編譯依賴與重新編譯

     編輯:關於C

「易碎基類問題」:頭文件變更會觸發所有包含它的源文件重新編譯。對於大型專案,編譯時間極其可觀。句柄類模式配合「不完整類型聲明」可大幅削弱此耦合。

問題場景

類別 B 包裝類別 A(句柄類),A 定義在頭文件中。修改 A 的成員會導致 B 的頭文件變更,進而觸發所有使用 B 的文件重編。

優化前:強耦合

// head.h
struct A { int i; };           // 完整定義
class B {
    A* a;                      // 需要 A 完整定義
public:
    B(int n = 0);
    void show();
    ~B();
};

優化後:前向聲明 + 定義下沉

// head.h
class B {
    struct A;                  // 不完整類型聲明(前向聲明)
    A* a;                      // 僅需知道 A 是類型,指針大小固定
public:
    B(int n = 0);
    void show();
    ~B();
};
// head.cpp
#include "head.h"
#include <iostream>

struct B::A {                  // A 的完整定義下沉至實現文件
    int i;
};

B::B(int n) {
    a = new A;
    a->i = n;
}

void B::show() { std::cout << a->i; }
B::~B() { delete a; }

效果

  • 修改 A 的成員(增刪欄位、改型別)只需改動 head.cpp。
  • head.h 不變 → 包含它的 main.cpp 等無需重新編譯。
  • 連結階段自動解析 B::A 完整定義。

適用場景與權衡

場景是否適用
大型專案、頻繁變更的內部實現類✅ 極佳
小型專案、穩定介面⚠️ 過度設計
需內聯/模板化的高頻調用❌ 不適用(定義需在頭文件)

此技巧屬於「編譯防火牆」模式核心手段之一,配合 Pimpl 慣用語可構建極具擴展性的 C++ 架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved