看板 C_and_CPP 關於我們 聯絡資訊
我自己想出解法了 把很大的class 裡面的成員變數 一起抽出去 然後寫成另外一個繼承體系的protected inner class 讓該繼承體系底下都可以使用 但是要friend原本的大class 讓大class也能使用 然後該繼承體系的物件中 都有一個該inner class的指標 原本很大的class 則擁有該inner class的實體 以及該繼承體系的一個指標 然後把所有工作委託給那個指標來執行 該指標則可以指向不同的實作內容而動態變化工作內容 下面有一個簡化過後的程式碼 測試過可以跑 關係大概是這樣 class A ──────→ abstract class B * △ | ┌───┼───┐ implement classes C1 C2 C3 資料的空間都還是配置在A物件裡面 而A和B繼承體系的class都可以存取 但是其他以外的class就無法使用資料 擴充新功能只要寫出C4~Cn去繼承B就好 其他現有類別的程式碼全部都不必更動 也不用補新的friend ----------------------------------------------------------------------------- #include <stdio.h> class A; class B; class C1; class C2; class C3; class B { protected: friend A; class Inner //原本在A的成員變數都搬到這裡 { public: int iData; //... }; Inner* m_pInner; public: virtual void DoSomething()=0; }; class C1 : public B { public: void DoSomething() { m_pInner->iData = 1; printf("C1 set data = %d\n", m_pInner->iData); } }; class C2 : public B { public: void DoSomething() { m_pInner->iData = 2; printf("C2 set data = %d\n", m_pInner->iData); } }; class C3 : public B { public: void DoSomething() { m_pInner->iData = 3; printf("C3 set data = %d\n", m_pInner->iData); } }; class A //本來很大的那個class { private: B::Inner m_iData; //實體空間配置 B* m_pB; //指標,可切換處理辦法 public: inline void SetB(B& rB) { m_pB = &rB; m_pB->m_pInner = &m_iData; } inline void DoSomething() { m_pB->DoSomething(); } }; int main() { A a; C1 c1; C2 c2; C3 c3; a.SetB(c1); a.DoSomething(); a.SetB(c2); a.DoSomething(); a.SetB(c3); a.DoSomething(); getchar(); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.210.62 ※ 編輯: iamstudent 來自: 140.113.210.62 (04/23 21:33)
loveme00835:你 class 的責任已經亂掉了... 04/23 22:53
iamstudent:還好還沒真的這樣改 04/24 01:29
iamstudent:看來我分析的功力還是不夠 04/24 01:33