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

MFC/C++ 類之間變數傳遞完整指南:全域變數、成員變數與設計模式

     編輯:程式設計綜合問答

場景一:A.cpp 定義的全域/靜態變數 → B.cpp 使用

方法 1:extern 宣告(最直接)

// A.cpp
double tempValue = 0.0; // 全域變數(非 static)

// B.cpp
extern double tempValue; // 宣告外部連結

void B::SomeFunction() {
    tempValue = 42.0; // 直接讀寫
}

方法 2:封裝存取函數(推薦,降低耦合)

// A.h
class A {
public:
    static double GetTempValue();
    static void SetTempValue(double val);
private:
    static double s_tempValue;
};

// A.cpp
double A::s_tempValue = 0.0;
double A::GetTempValue() { return s_tempValue; }
void A::SetTempValue(double val) { s_tempValue = val; }

// B.cpp
#include "A.h"
void B::UseValue() {
    double v = A::GetTempValue();
}

場景二:A.h 類別的 public 成員變數 → B.cpp 使用

前提:B 必須持有 A 物件的指標/引用

// A.h
class A {
public:
    double pubValue = 0.0;
};

// B.h
class B {
public:
    void SetA(A* aPtr) { m_a = aPtr; }
    void UsePubValue();
private:
    A* m_a = nullptr;
};

// B.cpp
void B::UsePubValue() {
    if (m_a) {
        double v = m_a->pubValue; // 透過物件存取
    }
}

// 使用端
A aObj;
B bObj;
bObj.SetA(&aObj);
bObj.UsePubValue();

若 pubValue 為 static 成員

// A.h
class A {
public:
    static double pubValue; // 宣告
    static double GetPubValue() { return pubValue; }
};

// A.cpp
double A::pubValue = 0.0; // 定義

// B.cpp 直接用 A::GetPubValue() 或 A::pubValue

進階模式:單例、觀察者、依賴注入

單例模式(全域唯一存取點)

class DataCenter {
public:
    static DataCenter& Instance() {
        static DataCenter inst;
        return inst;
    }
    double tempValue;
private:
    DataCenter() = default;
};

// 任意處使用
DataCenter::Instance().tempValue = 3.14;

觀察者模式(資料變更自動通知)

// 定義介面
class IDataListener {
public:
    virtual void OnDataChanged(double newVal) = 0;
};

// A 管理監聽者
class A {
    std::vector listeners;
public:
    void AddListener(IDataListener* l) { listeners.push_back(l); }
    void SetTempValue(double v) { 
        tempValue = v; 
        for (auto l : listeners) l->OnDataChanged(v); 
    }
};

// B 實作介面並註冊
class B : public IDataListener {
public:
    void OnDataChanged(double v) override { /* 反應 */ }
};

核心原則總結

場景推薦做法避免做法
單一全域資料封裝類別 + 靜態存取函數裸露 extern 全域變數
類別成員資料持有物件指標/引用複製資料導致不一致
多模組共享狀態單例/依賴注入/事件總線隨意包含頭檔造成循環依賴

現代 C++ 建議:優先使用依賴注入,透過建構函式傳遞介面指標,配合智慧指標管理生命週期,實現低耦合、高可測試性。

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