Как выбрать между некоторыми методами во время выполнения? - PullRequest
1 голос
/ 15 июня 2011

Чтобы сделать мой код немного понятнее, я пытался разбить длинный кусок кода на несколько методов (немного похожий на PHP).

У меня есть переменная CurrentStep, указывающая текущийрендеринг экрана.

class Game
{
private:
    enum Step { Welcome = 0, Menu, };
    unsigned int CurrentStep;
}

Теперь я хочу вызвать соответствующий метод при рендеринге фрейма:

void Game::RenderFrame
{
    switch (CurrentStep)
    {
    case Welcome:
        // the actual work is done by WelcomeScreen() to keep this clean
        WelcomeScreen(); break;
    case Menu:
        // same here
        MenuScreen(); break;
    }
}

Надеюсь, понятно, чего я пытался достичь.В конце концов предполагается, что он вызовет соответствующий метод (во время выполнения).

Однако этот путь просто избыточен ... Разве нет "лучшего" способа использовать C ++?

Ответы [ 5 ]

2 голосов
/ 15 июня 2011

Прежде всего, ваша приватная переменная должна быть объявлена ​​как Step CurrentStep;, а RenderFrame() требует скобок.Далее трудно дать конкретный совет, учитывая, насколько общий и расплывчатый вопрос, но в принципе вы могли бы сделать что-то с наследованием:

2 голосов
/ 15 июня 2011

Полагаю, вы ищете шаблон команды .

Прочитайте это подробное объяснение (для C ++)

http://www.dreamincode.net/forums/topic/38412-the-command-pattern-c/

чтобы узнать больше об этом.

1 голос
/ 15 июня 2011

Сколько у вас будет других состояний?

Есть ли в реализациях WelcomeScreen() и MenuScreen() что-нибудь общее, что можно переместить в общий базовый класс?

Еслиответ на первый вопрос - «несколько других» или ответ на второй «не очень», тогда ваш код просто в порядке.По возможности сделайте все просто.

Наследование, шаблон команд и другие предлагаемые подходы немного усложнят ваш код, одновременно предоставляя большую гибкость при добавлении большего количества состояний в будущем.Вы лучше знаете свое приложение и знаете, что его ждет в будущем.

1 голос
/ 15 июня 2011

Помимо полиморфного подхода, который опубликовал Керрек (некоторые называют его классическим объектно-ориентированным подходом), существуют и другие методы, в которых не используется полиморфизм.

  • Один из них методы, управляемые таблицами

  • еще одна важная вещь, о которой стоит упомянуть, это шаблон посетителей, уже эффективно реализованный в библиотеке вариантов буста.Вот пример , который показывает нечто похожее на то, что вы хотите сделать

1 голос
/ 15 июня 2011

Нам понадобится больше информации. Если вы сделаете RenderFrame виртуальной функцией, вы можете использовать полиморфизм во время выполнения, чтобы вызвать правильный регистр RenderFrame.

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