Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переадресация ссылки на класс 
:(
    Опции темы
RaP1D
Дата 17.1.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



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

Есть класс: 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;

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

Это сообщение отредактировал(а) RaP1D - 17.1.2009, 22:23
PM MAIL   Вверх
mes
Дата 17.1.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот навскидку три варианта :

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, ... )
       }
...
}



Это сообщение отредактировал(а) mes - 17.1.2009, 23:26


--------------------
PM MAIL WWW   Вверх
RaP1D
Дата 18.1.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 12.10.2008

Репутация: нет
Всего: нет



Большое спасибо!!!
PM MAIL   Вверх
Kallikanzarid
Дата 18.1.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Кстати, лучше использовать полиморфизм, чем такого рода свитчи, и ссылки вместо указателей. Это если ты, конечно, в С++ работаешь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.