簡體   English   中英

C ++面向對象設計

[英]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函數,因為我想做的是分離實現和邏輯,並避免長類做太多事情。

顯然, GraphicsInput應該與同一個Allegro類對話。 因此,您應該這樣做:創建Allegro類實例,然后在GraphicsInput的構造函數中使用該實例。

您的Game類應創建Allegro的實例,並且應將相同的實例傳遞給InputGraphics ,后兩個將僅保存該實例的引用

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

請注意, Game中成員的順序很重要。 應該在keyBoardinputGamegraphics之前聲明allegro 這樣可以確保先創建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 ,這在這里也很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM