2011-09-07 189 views
0
class Allegro {}; 

class Input 
{ 
private: 
    Allegro allegro1 
}; 

class Graphics 
{ 
private: 
    Allegro allegro2 
}; 

class Game 
{ 
private: 
    Input keyBoardinput; 
    Graphics Gamegraphics; 
}; 

在輸入中,我需要訪問與用戶鍵盤輸入相關的Allegro功能。在Graphics類中,我只需要能夠讓我在屏幕上繪製東西的函數,比如形狀等。然而,Game類也需要在遊戲進行時訪問Input和Graphics函數。關於如何改進設計。我知道我可以刪除Graphics和Input類,並且擁有Game類中的所有Allegro函數,因爲我想要做的是將實現和邏輯分開,並避免執行太多事情的長類。C++面向對象設計

+2

這裏沒有問題。沒有什麼可以改進的,到目前爲止你所擁有的是如此之少,以至於無法告訴它可能有什麼問題。你發佈的內容顯然是面向對象的,但這是一個很小的例子,不可能指出任何好的或壞的東西。 – meagar

+0

我需要做出一個設計決定,問題是,是否有更好的方法來實現類似的目標,一個只有遊戲和Allegro類的例子,並在它們之間插入一個接口。這種方式比代碼中說明的構圖關係更好嗎?在一個對象上創建兩個對象是一個好主意/設計嗎? – Obakeng

+0

不,像你在你的問題中說的那樣,單一的大規模快板班不會更好,因爲你在問題中陳述的原因。除了你已經說過的你知道的之外,根據你發佈的代碼的存根,沒有辦法告訴你任何有用的東西。 – meagar

回答

3

顯然,GraphicsInput應該與同一Allegro類談話。所以你應該這樣做:創建Allegro類實例,然後在構造函數中使用GraphicsInput

2

Game類應該創建Allegro實例和相同的實例應該傳遞給InputGraphics,後兩者將只需持有該實例的參考

class Game 
{ 
    Game() : allegro(/*..*/), keyBoardinput(allegro), Gamegraphics(allegro) {} 
private: 
    Allegro allegro; //actual instance 
    Input keyBoardinput; 
    Graphics Gamegraphics; 
}; 

請注意,Game中的成員順序很重要。 allegro應在keyBoardinputGamegraphics之前申報。這確保在其餘兩個之前創建allegro,然後將allegro(完全創建的實例)傳遞給InputGraphics的構造函數。

然後確保InputGraphics保持參考的是從Game通過allegro。不要使allegro副本:

class Input 
{ 
public: 
    Input(Allegro & allegro) : allegro1(allegro) {} 
private: 
    Allegro & allegro; //reference - not copy! 
}; 

class Graphics 
{ 
public: 
    Graphics(Allegro & allegro) : allegro1(allegro) {} 
private: 
    Allegro & allegro; //reference - not copy 
}; 

注意,所有這些類的利用member-initialization-list這也是非常重要的位置。