Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Перегрузка функции. Зависимость от формулы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Подвинуть кнопку http://www.cyberforum.ru/cpp-beginners/thread636118.html
Как средствами MFC при нажатии кнопки Windows(IDC_MYBUTTON_1 101) левой кнопкой мыши заставить её передвинуться? И посоветуйте, пожалуйста, толковую книгу по MFC. #define IDC_MYBUTTON_1 101...
C++ конструкторы копий 1) правильно ли я понял задание class noname { public: noname() : pstring(new std::string), i(0), d(0) {} noname(const noname&); private: std::string *pstring; int i; http://www.cyberforum.ru/cpp-beginners/thread636088.html
C++ Автоматизация(перемещение)
Незнаю, но полагаю лучше будет на с++ написать такое...Итак.Предположим на рабочем столе Windows есть Корзина, и она расположена где нибудь там в левом верхнем углу.Как сделать так, чтобы она...
Автоматический ввод логина и пароля C++
#include <fstream> using namespace std; bool copyFile (const char SRC, const char DEST) { ifstream src; ofstream dest; src.open (SRC, ios::binary); dest.open (DEST,...
C++ Половина двумерного массива теряет значения http://www.cyberforum.ru/cpp-beginners/thread636071.html
Тут код: //заголовок #ifndef MATRIX_H #define MATRIX_H #include <iostream> using std::istream; using std::ostream; using std::cout; using std::cerr;
C++ MinGW+MSYS - как грамотно пользоваться? Вопрос: Добрый день, уважаемые форумчане! У меня такой вопрос: Пытаюсь собрать PostgreSQL под Windows, используя связку MinGW+MSYS. Раньше не пользовался MSYS, по сему вопрос от неопытности.... подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
11.08.2012, 17:25
Перегрузка выполняется статически. При компиляции. Она не обеспечивает динамический выбор функции в процессе выполнения программы.

Для динамического выбора надо воспользоваться механизмом виртуальных функций: делаете абстрактный класс «Вычислитель r» с виртуальной функцией «вычислить r», делаете сколько надо наследников от этого класса (конкретных классов-вычислителей), в каждом из них реализуется свой вариант вычисления r; свичем выбираете, какой вариант нужен, создаёте (динамически, с помощью new) нужный экземпляр конкретного класса-вычислителя, приводите его к базовому типу интерфейса «Вычислитель r» и возвращаете такой указатель.

Или же можно воспользоваться вариантом «для бедных»: указателем на функцию.

Иллюстрация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// базовый интерфейс
class ICalcR {
public:
  virtual double calc(double a, double b) = 0;
};
 
// конкретный вариант раз
class CalcR_Add : public ICalcR {
public:
  double calc(double a, double b)
  {
    return a + b;
  }
};
 
// конкретный вариант два
class CalcR_Sub : public ICalcR {
public:
  double calc(double a, double b)
  {
    return a - b;
  }
};
 
// обеспечивает динамический выбор
ICalcR* chooseCalcR(int pro)
{
  if (pro == 1) {
    return new CalcR_Add();
  }
  else if (pro == 2) {
    return new CalcR_Sub();
  }
  else {
    // ругнуться на кривое значение pro
  }
}
 
/* где-то в программе */
// выбираете *один раз* нужный вариант и запоминаете его в rCalculator
ICalcR *rCalculator = chooseCalcR(pro);
 
// передаёте его в функцию, где он нужен
func(vector, rCalculator);
 
// в функции вызываете виртуальный метод:
  rCalculator->calc(a, b);
 
// и не забыть потом убрать за собой
delete rCalculator;
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru