※ 引述《cory8249 (Cory)》之銘言:
: 問題(Question):
: 請問如何正確規劃、分割 class 與 header 架構 ?
: 小弟目前寫一個 CPU 模擬器
: 開了以下幾個 class :
: Core, Instruction, Memory, Regsiter, ALU, Controller
: 不曉得怎麼檔案架構分割比較好
: 想請教板上各位高手
: 首先 Core 是最大的一個 class 內部包含 Instruction , Memory ... 等等
: 而 ALU , Controller 又需要存取 Instruction , Memory, Register
: 1.
: 那這樣在 Core.h 的 class Core 宣告中 要用 forward declaration 嗎 ?
: 例如:
: class ALU;
: class Controller;
: class Memory;
: class ...
: class Core{
: public:
: ....
: private:
: Memory *imem, *dmem; // OK
: ALU alu; // compile error : field alu has incomplete type
: Controller controller; // compile error : field ... has incomplete type
: };
: forward delclaration 似乎只能用 pointer 的方式 ?
對
: 所以在 Core 裡面包含的其他 class 看似都要用 pointer 囉 ?
對,這我也有想過,不過在c++中一定要這樣用
不然會 include 迴圈就編不過
: 2.
: 因為有很多訊號、指令等等 我想開 enum 去寫
: 但是 enum 好像只能宣告定義一次而已
: 假設我在 Instruction.h 中定義了 enum InstType { R_TYPE, I_TYPE, J_TYPE };
: 但是 ALU 、 Controller 中也需要用到這個 enum
: 所以 ALU 、 Controller 要 #include "Instruction.h" ?
對,所以你可以定一個 .h 檔,專門去定義 enum 或 const int 常數
: 3.
: 因為 ALU , Controller 會互相存取資料、 call function 等等
: Header include 要怎麼寫比較好 ?
: 可以互設為 friend class 嗎 ?
: class ALU;
: class Controller{
: public:
: friend class ALU;
: private:
: ...
: }
: 像是這樣 ?
: 問題有點多 不好意思 麻煩各位了 感謝
用 public GetXXX() 函數的方式拿,
friend 沒有 public private 的分別
他永遠是你的好朋友 :)
不然的話你用有MVC的感覺
ALU 分成
ALU_Model ALU_View ALU_Control
放rawdata 放資料轉型或處理 放控制指令
我的感覺是你可以再參考一下
設計模式裡的 singleton 來拿資料
Iterator 跟 Command 來處理指令
Strategy 來產生不同的 memory model
然後抱著一定會打掉重練的心情去寫程式吧~
才不會得失心太重,第一次寫總是會有一堆問題的,
不太可能一步到位的。