Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Переадресация ссылки на класс


Автор: RaP1D 17.1.2009, 22:16
Сразу оговорюсь, что функция написана неправильно (ссылки)...

Есть класс: GameGui
Есть несколько классов, являющихся его элементами: main_menu, game_menu, options
Есть несколько define'ов: 
Код

#define MAINMENU 100
#define GAMEMENU 101
#define OPTIONS 102

Есть функция для появления окна (похожая и для исчезновения):
Код

bool GameGui::PanelShow(int panel, float _time)
{
    if(panel == MAINMENU)
    {
        Window &window = main_menu;
        PanelSetAlpha(MAINMENU);
    }

    if(panel == GAMEMENU)
    {
        Window &window = game_menu;
        PanelSetAlpha(GAMEMENU);
    }

    if(panel == OPTIONS)
    {
        Window &window = options;
        PanelSetAlpha(OPTIONS);
    }

    if(window.alpha == 255) return true;
    if(window.alpha == 0) window.time = 0;
    window.time += dt;
    percent = window.time/_time;
    if(percent > 1) percent = 1;
    window.alpha = 255*percent;

    return false;
}


В эту фу-цию передается 2 переменные: 1-название окна; 2-скорость появления...
Кароче мне надо, чтоб в зависимости от названия панели ссылка ссылалась на соответствующий класс... Если писать так, то ссылку не видит компилятор и выдает ошибку... Можно, конечно передавать в функцию класс, но мне надо именно так...

Как исправить сию функцию? Можно и без ссылок (указатели)...

Я могу конечно использовать:
Код

if(window.alpha == 255) return true;
if(window.alpha == 0) window.time = 0;
window.time += dt;
percent = window.time/_time;
if(percent > 1) percent = 1;
window.alpha = 255*percent;

отдельно для каждого класса, но это глупо...

Автор: mes 17.1.2009, 23:18
вот навскидку три варианта :

1. С указателем :
Код

  Window * window; // обявляем указатель 
  switch (panel)
  { 
         case MAINMENU : window = &main_menu; PanelSetAlpha(MAINMENU); break;
//      case ...
//      ...
         default : window = NULL;
 }
 if (window)
{
  // тут блендинг 
}


2. Вынести блендинг как отдельную функцию
Код

void Blend (Window& w, ...) 
{
 ... 

}
...

 if(panel == MAINMENU)
    {
        PanelSetAlpha(MAINMENU);
        Blend (main_menu, ... )
    }


3. 
Код

Window& GetWendowRef (int panel)
{
  return 
            (panel== MAINMENU) ?   main_menu :
            (panel == GAMEMENU)?  game_menu :
             dummy_menu; // (не)удобство ссылки заключается в том, что она всегда должна быть
                                      // поэтому если panel указывает в пустоту мы должны вернуть либо заглушку
                                     // либо вызвать исключение
                                      
}



Добавлено @ 23:24
Цитата(RaP1D @  17.1.2009,  21:16 Найти цитируемый пост)
Есть функция для появления окна (похожая и для исчезновения):

Чтоб в каждой функции не делать набор условий для определения панели лучше использовать комбинацию всех трех примеров.

Код

void Blend (Window& w)
{
}
Window * GetWindowPtr (int panel)
{
    return 
       (panel== MAINMENU) ?   main_menu :
       (panel == GAMEMENU)?  game_menu :
       NULL;
}

bool  PanelShow(int panel, float _time, bool show)
{

       Window *window =GetWindowPtr (panel);
       if (window)
       {
         PanelSetAlpha(panel);
         if (show)           // если показывать
            Blend (*window, ... )
         else         // если скрывать 
            Blend (*window, ... )
       }
...
}


Автор: RaP1D 18.1.2009, 10:39
Большое спасибо!!!

Автор: Kallikanzarid 18.1.2009, 12:43
Кстати, лучше использовать полиморфизм, чем такого рода свитчи, и ссылки вместо указателей. Это если ты, конечно, в С++ работаешь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)