| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > переопределение функции |
| Автор: gordmiand 25.11.2010, 21:31 | ||
| Подскажите пож-та каким образом верно определить различную реализацию одной и той же функции в зависимости от значения внешней переменной (parametr)? Проверять значение parametr внутри функции Func1 и в зависимости от его значения выполнять те или другие операторы нежелательно, так как эта функция вызывается сотни раз и каждый раз проверять значение parametr нет смысла – оно одно и тоже, равное заданному в начале программы… я делаю что-то типа:
будет конечно же ошибка, так как условие для #if должно быть константным (const), но у меня-то это значение (parametr) считывается из файла в начале программы (то есть параметр parametr переменен)…как быть? |
| Автор: gordmiand 25.11.2010, 21:47 | ||
| язык С++ - пишу в Qt 4.6.... то есть только так:
что , опять же, нежелательно... или что Вы имели ввиду? подскажите программно пож-та... |
| Автор: Cheloveck 25.11.2010, 21:49 | ||
Используй функторы
Для создания функтора можно использовать паттерн Абстрактная фабрика |
| Автор: gordmiand 25.11.2010, 21:54 |
| Cheloveck: это явно не самый простой способ - функторы, дополнительные классы для каждой функции...надо как-то проще...гораздо проще... |
| Автор: Cheloveck 25.11.2010, 22:09 | ||
тогда указатели...
|
| Автор: gordmiand 25.11.2010, 22:40 | ||
а почему так не работает:
если parametr = 1; то все работает, при parametr = 2 (например); не срабатывает #else #define Func1(x) ( x ) - ошибок нет, но в эдит ничего не выводится.... почему и как это испрaвить? |
| Автор: Cheloveck 25.11.2010, 22:50 | ||
Это то, что препроцессор передаёт компилятору
Добавлено через 2 минуты и 8 секунд Почитай про препроцессор. Такого делать вообще нельзя. Препроцессор не работает в рантайме, только при компиляции. |
| Автор: gordmiand 25.11.2010, 23:07 | ||||
Cheloveck: почему нельзя делать
почему же тогда
отлично и верно сработает #else...но это если РУКАМИ закомментировать #define Flag - весь вопрос и состоит в том как программно задавать/не задавать #define Flag... в любом случае Вашими способами очень сложно...мой данный пример можно как-то подкрутить до верного? |
| Автор: mes 25.11.2010, 23:15 | ||
|
| Автор: gordmiand 25.11.2010, 23:23 |
| mes : первые 2 строки понятны - определение функций fn1 и fn2... а вот что делается в третьей строке? когда вызывается функция fn1, а когда - fn2? поясните пож-та.... |
| Автор: mes 25.11.2010, 23:30 | ||
| если параметр == true (!=0) то указатель pfn инициализируется адресом fn1, иначе fn2; в последний строчке идет вывод в консоль результата функции.. Добавлено @ 23:31 можно переписать так
|
| Автор: Cheloveck 26.11.2010, 10:18 | ||||
gordmiand, способ mesа такой же, как мой последний, только требует глобальной переменной. Объекты же сами хранят своё состояние, а ведь именно это вам и надо. Если это для вас сложно, может не стоит писать на C++?
Потому, что директивы препроцессора должны начинаться с символа #, и их (директив) не должно быть более одного на строку. |
| Автор: mes 26.11.2010, 10:47 |
| Автор: Cheloveck 26.11.2010, 11:00 |
Это либо то, что ТС хочет избежать, либо глобальная переменная, либо дополнительный параметр. |
| Автор: mes 26.11.2010, 11:23 | ||||
последний пример, это этот ? :
не могли бы вы уточнить где преимущества и зачем столько лишнего ? |
| Автор: mes 26.11.2010, 11:40 | ||
ладно не буду ждать ответа.. взял за основу вашу мегафункцию - сравнивайте :
|
| Автор: Cheloveck 26.11.2010, 11:46 | ||
mes, если будет 50 подобных функций, вам нужно будет 50 раз писать
Или передавать уже созданный указатель повсюду, а объект класса можно создать где угодно, и он будет работать сразу. Конструктор класса легко может выкинуть исключение, если параметр не тот, что ожидается. |
| Автор: mes 26.11.2010, 11:54 | ||||
для получения объекта нужен все равно параметр.. для получения функции он же..
достаточно вынести из функции :
|
| Автор: Cheloveck 26.11.2010, 11:56 |
И, теперь, если придать этому законченный вид, получится мой пример. |
| Автор: mes 26.11.2010, 11:57 | ||||
| оба эти варианта, (посредством функтора и функции) требуют одного и того же.. но у функтора есть некоторые затраты, однако и преимущества связанные с хранением контекста.. но так как контекст у нас не используется, то зачем платить больше ? тем более что для тс, имхо, с функциями будет полегче.. Добавлено через 8 минут и 58 секунд
не совсем :
Добавлено через 10 минут и 30 секунд но вопрос был не в схожести, а в том что |
| Автор: Леопольд 26.11.2010, 14:43 | ||||
const - обрабатывается не препроцессором, а компилятором. Этот модификатор призван защитить переменную от изменений.
http://forum.vingrad.ru/forum/topic-270683/kw-compiler-linker-preprocessor.html http://forum.vingrad.ru/forum/topic-269794/kw-faq-c++.html |
| Автор: Cheloveck 26.11.2010, 18:06 | ||
http://forum.vingrad.ru/index.php?showtopic=316068&view=findpost&p=2254657 |