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


Автор: Ostap 15.2.2006, 22:58
Подскажите как сделать "красиво"

Код

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>
   }
}



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

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

Автор: bel_nikita 16.2.2006, 00:57
Код

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(); }

Автор: np9mi7 16.2.2006, 01:20
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 - а нет.... :-)

Автор: Ostap 16.2.2006, 11:26
np9mi7, если не сотсавит труде не мог бы прокоментировать свой код

Автор: MAKCim 16.2.2006, 18:05
могу я 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 надо добавить виртуальный деструктор

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