首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 多檔案專案:類別成員變數生命週期與跨檔案存取

     編輯:程式設計疑難解答

問題:`A.cpp` 執行 `Setmap()` 填入 `Int_double_map`,隨後 `B.cpp` 呼叫 `Getmap()` 取值,此時 map 內容是否失效?

結論:取決於物件實例是否同一個

  • **同一個 `A` 物件實例**:`Int_double_map` 為成員變數,生命週期隨物件,**資料保留**,`B` 透過指標/參考存取同一物件 → **能正確取值**。
  • **不同 `A` 物件實例**:各自擁有獨立 `Int_double_map`,`A.cpp` 寫入的是實例 1,`B.cpp` 讀取實例 2 → **讀到空 map (或預設值)**。

代碼審視關鍵點


// A.h
class A {
    std::map Int_double_map; // 非 static,屬於實例
public:
    void Setmap();
    double Getmap(uint16_t m);
};

// B.h
class B {
    A* a_pointer; // 指向某個 A 實例
public:
    B(A* p) : a_pointer(p) {}
    double Getmap(uint16_t n) { return a_pointer->Getmap(n); }
};

// main.cpp
int main() {
    A a_obj;           // 實例 1
    a_obj.Setmap();    // 填入資料
    B b_obj(&a_obj);   // 共享同一實例
    std::cout << b_obj.Getmap(0); // 正確印出 0.1
}

常見導致「資料遺失」的寫法


// 錯誤:B 建構子內 new 一個新的 A
B::B() : a_pointer(new A()) {} // 這是實例 2,map 為空
// 正確:外部傳入已初始化的 A 指標
B::B(A* p) : a_pointer(p) {}

若需全域共享:用 `static` 成員或單例


class A {
    static std::map Int_double_map; // 屬於類別
public:
    static void Setmap() { ... }
    static double Getmap(uint16_t m) { ... }
};
// 任何處呼叫 A::Getmap(0) 皆見相同資料

除錯建議

  1. 在 `Setmap`、`Getmap` 加印出 `this` 指標:`std::cout << "A@" << this << std::endl;`,確認是否同一實例。
  2. 檢查 `B` 建構子是否 `new A()` 或接收外部指標。
  3. 用智慧指標 `std::shared_ptr` 管理生命週期,避免懸空指標。

核心原則:**C++ 非 static 成員變數屬於實例**,跨檔案存取必須確保操作的是**同一實例**,否則資料天然隔離。

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