[英]C++ Object Oriented Design
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函數,因為我想做的是分離實現和邏輯,並避免長類做太多事情。
顯然, Graphics
和Input
應該與同一個Allegro類對話。 因此,您應該這樣做:創建Allegro
類實例,然后在Graphics
和Input
的構造函數中使用該實例。
您的Game
類應創建Allegro
的實例,並且應將相同的實例傳遞給Input
和Graphics
,后兩個將僅保存該實例的引用 。
class Game
{
Game() : allegro(/*..*/), keyBoardinput(allegro), Gamegraphics(allegro) {}
private:
Allegro allegro; //actual instance
Input keyBoardinput;
Graphics Gamegraphics;
};
請注意, Game
中成員的順序很重要。 應該在keyBoardinput
和Gamegraphics
之前聲明allegro
。 這樣可以確保先創建allegro
再創建其余兩個,然后再將allegro
(完全創建的實例)傳遞給Input
和Graphics
的構造函數。
然后確保Input
和Graphics
擁有從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 ,這在這里也很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.