C ++ объектно-ориентированный дизайн - PullRequest
0 голосов
/ 08 сентября 2011
class Allegro {};

class Input
{
private:
    Allegro allegro1
};

class Graphics
{
private:
    Allegro allegro2
};

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

При вводе мне нужен доступ к функциям Allegro, связанным с вводом с клавиатуры пользователя.В классе Graphics мне нужны только функции, которые позволят мне рисовать объекты на экране, например фигуры и т. Д. Однако классу Game также необходим доступ к функциям ввода и графики во время игры. Есть идеи о том, как я могу улучшитьдизайн.Я знаю, что могу удалить классы Graphics и Input и иметь все функции Allegro внутри класса Game, потому что я хочу разделить реализацию и логику, а также избежать длинных классов, которые делают слишком много вещей.

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Очевидно, что Graphics и Input должны разговаривать с одним и тем же классом Allegro.Так что вы должны сделать это: создать экземпляр класса Allegro, а затем использовать этот экземпляр в конструкторах для Graphics и Input.

2 голосов
/ 08 сентября 2011

Ваш класс Game должен создать экземпляр Allegro, и тот же экземпляр должен быть передан Input и Graphics, а два последних просто будут содержать ссылку экземпляра.

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

Обратите внимание, что порядок членов в Game важен.allegro должен быть объявлен до keyBoardinput и Gamegraphics.Это гарантирует, что allegro будет создан перед двумя остальными, а затем вы передадите allegro (полностью созданный экземпляр) конструкторам Input и Graphics.

И затем убедитесь, чтоInput и Graphics содержат ссылку из allegro, переданную из Game.Не делайте копию 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 , что также очень важно здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...