C++跨類調用(類間值傳遞、跨類調用方法)
在面向對象編程的時候經常會遇到不同類實例之間的跨類調用,包括跨類值傳遞以及跨類調用方法,實際運用是有很多方法都可以解決這一問題,今天主要總結2個常用且通用的方法。
1.通過全局變量實現跨類調用
(1)優缺點
優點: 簡單,快速,方便理解,尤其類實例個數少時非常方便。
缺點: 安全性低,類實例個數多少時非常不方便,容易出現錯誤。
(2)思想原理
定義若干全局指針變量存儲每個類的每個實例對象的指針(當然是需要互相調用的,不調用的肯定是不寫咯!!!),在實例化對象建立後將全局指針變量指向該實例對象,在任何地方(包括類內)都可以利用這個指針調用相應的方法,獲得相應的成員變量。注意:每個實例對象對應一個指針,不是每個類,分不清類與實例的自行百度。
(3)具體流程
以下面的例子來說明具體的流程:
例:現有 類A的實例對象a想要獲取類B實例化對象b的成員變量m_b的值。
(a)A.h , B.h 都無需做任何修改。
(b)B.cpp中包含A的頭文件,定義一個全局的B類指針pB。
CB * pB = new CB;
(c)在實例化b的.cpp文件中添加
extern CB * pB; //extern表示變量或者函數的定義在別的文件中
(d)在b實例化時將pB指向b。
CB * b = new CB(); //調用的構造函數不同時,應該傳入參數
pB = b;
注:這裏也可以利用B的構造函數將pB指向b,適用於只有一個B類實例時。具體做法是在B.pp中添加
extern CB * pB;
在B的構造函數中添加
pB = this; //構造的實例的指針保存在pB中;
這樣就可以在整個工程中隨意調用b的成員變量和成員函數了,當然調用前需要用extern CB * pB;先聲明。
2.通過類內指針變量實現跨類調用
(1)優缺點
優點: 安全性高,尤其類實例個數多時非常快速方便。
缺點: 相對複雜,理解稍微困難。
(2)思想原理
在類內添加被調類的指針爲成員變量,在被調用類的對象實例化以後,將指針(成員變量)指向該實例,之後就可以通過關聯的實例完成跨類調用。
(3)具體流程
以下面的例子來說明具體的流程:
例:現有 類A的實例對象a想要獲取類B實例化對象b的成員變量m_b的值;
類B的實例對象b想要獲取類A實例化對象a的成員變量m_a的值。
(a)A.h , B.h 中分別包含對方的頭文件。
(b)CA中添加B類的指針,CB中添加A類的指針;
CB * pB; //A.h中添加
CA * pA; //B.h中添加
此時編譯連接會報錯,因爲這是一個“雞生蛋,蛋生雞的問題”
^ _ ^ 感興趣可以研究一下C++的編譯鏈接過程。下一步就是解決這一問題。
(c)A.h中A類聲明前添加B類聲明;B.h中B類聲明前添加A類聲明;
class CB; // A.h中A類聲明前
class CA; // B.h中B類聲明前
(d)指針實例化各類對象後,將指針指向各類的實例對象
CA* a = new CA(); //注意構造函數
......
CB* b = new CB(); //注意構造函數
// 實例化完成後立即進行關聯
a->pB = b;
b->pA = a;
此時就可用類內的指針訪問其他類實例對象的成員變量以及成員函數。
說了這麼多肯定很多同學在疑惑爲什麼第二種方法這麼複雜,存在的意義何在,再次簡單說明一下第二種方法存在的合理性。
通常我們定義的一個類基本就只有一個或者少數幾個類實例對象,這種情況有第一種方法就可以很快的完成開發(除非BOOS不讓你用全局變量)。但是如果我們有100個A類的實例對象,每個都需要單獨的讀取或者調用B類的100實例對象中的某個實例對象的成員變量或者成員函數呢?是不是想想就頭大呢?這麼多全局變量,還要對應,光寫代碼時就會出錯,同時還毫無安全性可言。這時利用第二種方法就可以較快速的完成開發。
由於本人能力限制,如果有不對的地方還望大神指正。