Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > полиморфный ввод


Автор: nvb 10.4.2012, 13:10
Программа, если поступает значение, заносит его в стек, если управляющий символ - вызывает функции.
подскажите, как лучше полиморфизм реализовать, что бы в зависимости от типа данных вызывались разыные функции?писть switch или if else не хотелось бы.есть смысл здесь делать полиморфный класс?

Автор: mes 10.4.2012, 14:25
не очень понял задачу, но вот на скорую руку накалякал, может поможет :
http://liveworkspace.org/code/52bac8fe4ba63d583ac668be89ebe761

Автор: nvb 10.4.2012, 14:40
ну здесь, как я понял, циклы и перебо значений, с целью проверить что у нас на входе. а я говорил о функции или шаблоне, которая в зависимости от того, что на входе -int,float или char вызывает соответсвующий метод. как-то  наверно с помошью шаблонов и специализаций должно делаться, просто определенно не могу понять как.

Автор: mes 10.4.2012, 14:42
Цитата(nvb @  10.4.2012,  13:40 Найти цитируемый пост)
что у нас на входе. 

на входе в каком виде у вас ? если типизированное значение, то чем не устраивает простая прегрузка ?!

Добавлено через 1 минуту и 37 секунд
Цитата(nvb @  10.4.2012,  13:40 Найти цитируемый пост)
 как я понял, циклы и перебо значений, с

нет, цикл для генереации значений на входе, а выбор происходет благодаря карте соответсвий.. т.е. просто переход, никакого перебора..

Добавлено через 2 минуты и 53 секунды
Цитата(nvb @  10.4.2012,  13:40 Найти цитируемый пост)
 просто определенно не могу понять как. 

прежде чем понять "как", надо определиться с "что есть" и "что получить"

Автор: nvb 10.4.2012, 14:56
значения стандартных типов на входе. перегрузка чего? перегрузить оператор тут не пулучится видимо:

istream & operator >> (istream & s, somedata & data)

тип данных скажем float data при вводе 'a' получим 0, насколько я понимаю. и анализ возращаемого значения тут не сделать. 

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

прошу прощения, несколько смутно излагаю.)

Автор: borisbn 10.4.2012, 14:56
http://liveworkspace.org/code/a03df1a7f871128fa6e8caa8b8a5c526

но можно и через шаблоны... лучше поточнее объясни задачу. лучше целиком, а не отрывками

Автор: nvb 10.4.2012, 15:04
алгоритм такой примерно:

ввод

  если int или float - значение в соответствующий стек

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

повторяем ввод 

так вот еще раз сформулирую вопрос: как такой ввод лучще оформить, при том, что неизвестно, введет оператор символ или числовое значение? я думал как это сделать полиморфно и не придумал)

Автор: mes 10.4.2012, 15:10
Цитата(nvb @  10.4.2012,  13:56 Найти цитируемый пост)
значения стандартных типов на входе. 

Цитата(nvb @  10.4.2012,  13:56 Найти цитируемый пост)
тип данных скажем float data при вводе 'a' получим 0, насколько я понимаю.

почитайте что есть поток данных.. без этого вам трудно будет даже самомусебе разъяснить, чего Вы хотите.. 
в потоке нет никаких типизированных данных, это всего лишь массив байтов, и поэтому разделять значения по их типу (за его отсустсвием)  не получится..


Автор: nvb 10.4.2012, 15:12
mes, я понимаю, я поэтому и написал, что нужно тогда вспомогательную переменную вводить, но тогда какого типа - непонятно

Автор: mes 10.4.2012, 15:12
в принципе вариантов чтения с потока всего 2 , 
1. согласованный.. когда вы точно знаете что сейчас в потоке и это читаете
2. вариантный.. когда читаете вариант (в нашем случае строку) и по внешнему виду определяете что с ним делать.. 



Автор: borisbn 10.4.2012, 15:14
nvb, если я тебя правильно понял, то тебе нужно получить из стандартного ввода строку, а затем уже понять, к чему эту строку можно преобразовать - к int, float или любой другой char.
Если так, то тебе ни полиморфизм, ни шаблоны не помогут, т.к. входной тип один - строка. Прийдётся проверять на возможность приведения к каждому типу по-очереди.

Добавлено через 6 минут и 45 секунд
nvb, если это - не задание в институте, то посмотри на другие языки (python, php и т.п.). Там такой проблемы нет. почти...

Автор: nvb 10.4.2012, 15:25
вот я об этом как раз: т.е. все-таки через строку делать? некак с помощью полиморфизма не сделть? 

borisbn, не,  но написать надо на с... интерпретируемые да, проще конечно

Автор: mes 10.4.2012, 15:32
Цитата(nvb @  10.4.2012,  14:25 Найти цитируемый пост)
 некак с помощью полиморфизма не сделть? 

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

Автор: Albor 10.4.2012, 16:37
Задача очень похожа на калькулятор, описываемый Стауструпом.

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