Как избежать дублирования кода? - страница 2

 

Отпадает вариант с указателем на функцию - в такую функцию невозможно передать параметр по ссылке, сильно ограничиваются возможности.  

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

 
Dmitry Fedoseev #:

Отпадает вариант с указателем на функцию - в такую функцию невозможно передать параметр по ссылке, сильно ограничиваются возможности.  

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

Спасибо! Хорошо, что сразу выяснилось, потому что параметры по ссылке мне наверняка понадобятся. Значит без сомнений выбираю ООП.

 
leon_17 #:

Спасибо! Хорошо, что сразу выяснилось, потому что параметры по ссылке мне наверняка понадобятся. Значит без сомнений выбираю ООП.

Не, ошибся, можно по ссылке передавать:

typedef void (*TFunc)(int&,double&); 

TFunc ptr;

void f1(int & a1,double & a2){
   a2=(double)a1/100;
}

void f2(int & a1,double & a2){
   a2=(double)a1/1000;
}

double main(int a1,double a2,TFunc & f){
   double r1=0,r2=0;
   for(int i=a1;i<a2;i++){
      f(i,r1);
      r2+=r1;
   }   
   return r2;
}

//

void OnStart(){

   ptr=f1;
   r1=main(0,10,ptr);
   ptr=f2;
   r2=main(0,10,ptr);   
   Alert(r1," ",r2);
}
 
По скорости совершенно одинаково
 
Dmitry Fedoseev #:

Не, ошибся, можно по ссылке передавать:

Но спасибо за ещё один понятный пример! Значит есть целых два полноценных приёма, когда я и в одном сомневался.


 
Dmitry Fedoseev #:

Виртуальный метод использовать. Цикл в базовом классе, а дополнительные действия в виртуальном методе производного класса:

...

Еще можно указатель на функцию использовать. В основном цикле вызывать функцию по указателю. См. typedef

А указатель передавать как параметр основной функции.

Спасибо Дмитрий. Это и есть самый убедительный пример всех прелестей ООП. А всё остальное от лукавого…
 
Alexey Viktorov #:
Спасибо Дмитрий. Это и есть самый убедительный пример всех прелестей ООП. А всё остальное от лукавого…
Это как раз нестандартное использование ООП. И, в общем-то, странноватое.
 
Sergey Gridnev #:
Это как раз нестандартное использование ООП. И, в общем-то, странноватое.

Ну… если ваши познания в ООП чуть выше моих, а мои около нуля, то может быть нестандартное…

 
leon_17 #:

Но спасибо за ещё один понятный пример! Значит есть целых два полноценных приёма, когда я и в одном сомневался.


Насколько мне помнится, то Вы говорили, что в одном цикле Вам нужны логические блоки

Вы: " Проблема в том, что необходимые логические блоки в любом случае должны находится внутри цикла, который и не хотелось бы каждый раз прописывать заново в каждой новой функции.  "

В примере Дмитрия цикл вызывается не один раз.

r1=main(0,10,ptr);
r2=main(0,10,ptr);
 
Alexey Viktorov #:

Ну… если ваши познания в ООП чуть выше моих, а мои около нуля, то может быть нестандартное…

Познания "около нуля" это как раз тот самый уровень, который позволяет оценивать собеседника по его короткой фразе.