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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать красиво? :) - Повторный вызов функции 
:(
    Опции темы
Ostap
Дата 15.2.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите как сделать "красиво"

Код

typedef struct somename
{
<...>
   double variable;
   int count;
<...>
} somename;
<...>
int main(void)
{
   somename term1, term2;
   <...>
   term1.count = 1;
   term2.count = 2;
   <...>
   term1.variable = somefunction(<...>, term1.count);
   term2.variable = somefunction(<...>, term2.count);
   return 1;
}

doubel somefunction(<...>, int count)
{
<...>
   if (count == 1)
   {
      <do something>
   }
   else if (count == 2)
   {
      <do other>
   }
}



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

PM MAIL   Вверх
DeadSoul
Дата 15.2.2006, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Ostap, в чем выражается "разница". Т.е. что различно при разных count? Например, в случае сортировки могут быть разные методы сравнения двух величин


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
bel_nikita
Дата 16.2.2006, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Код

typedef struct somename
{
<...>
   double variable;
   int count;
<...>
} somename;
<...>
int main(void)
{
   somename term[2];
   <...>
   term[0].count = 1;
   term[1].count = 2;
   <...>
for (int i = 0 ; i < sizeof(term)/sizeof(term[0]); ++i)
   term[i].variable = somefunction( term[1].count == 1 ? &do_something : &do_other );
   return 1;
}

doubel do_something() { <...> }

doubel do_other() { <...> }

doubel somefunction( double (*pF)() ) { return pF(); }



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
np9mi7
  Дата 16.2.2006, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Ostap, когда тебе известно, что count == 1 или count == 2? Можно завернуть всё это дело в тип и попробывать виртуальные методы.
Код

struct __somename
{
    double variable;
    
    virtual double virtual_calculate () = 0;
    
    void calculate ()
    {
        variable = virtual_calculate ();
    }
};

struct __one : public __somename
{
    virtual double virtual_calculate ()
    {
        return <do something 1>;
    }
};

struct __two : public __somename
{
    virtual double virtual_calculate ()
    {
        return <do something 2>;
    }
};

void calculate (__somename & refVariable)
{
    refVariable.calculate ();
}

void main ()
{
    
    __one one,
    __two two;
    
    calculate (one);
    calculate (two);
    
}


ps: bel_nikita а у меня if - а нет.... :-)


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Ostap
Дата 16.2.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



np9mi7, если не сотсавит труде не мог бы прокоментировать свой код
PM MAIL   Вверх
MAKCim
Дата 16.2.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



могу я smile
есть абстрактный класс __somename, в котором один чисто виртуальный метод, который в различных реализациях возвращает разный double
__one и __two - реализации __somename, оба они наследуют невиртуальный calculate который вызывает замещенные виртуальные методы __one и __two, тем самым устанавливая внутреннюю переменную variable
глобальная calculate получает ссылку на базовый класс, вызывает member-function calculate

надеюсь понятно объяснил

ps. я бы вместо глобальной calculate сделал что-то вроде
Код

class wrapper
{
private:
    __somename* pointer;
public:
    wrapper(__somename* ptr)
        : pointer(ptr) {}
    ~wrapper() {delete pointer;}
    void calculate() {pointer->calculate();}
};

и создавал бы так
Код

wrapper p(new __one);

соответственно для корректности удаления в __somename надо добавить виртуальный деструктор



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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.0951 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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