問題:`A.cpp` 執行 `Setmap()` 填入 `Int_double_map`,隨後 `B.cpp` 呼叫 `Getmap()` 取值,此時 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) {}
class A {
static std::map Int_double_map; // 屬於類別
public:
static void Setmap() { ... }
static double Getmap(uint16_t m) { ... }
};
// 任何處呼叫 A::Getmap(0) 皆見相同資料
核心原則:**C++ 非 static 成員變數屬於實例**,跨檔案存取必須確保操作的是**同一實例**,否則資料天然隔離。