Вопросы по С/С++ (СИ)
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Reflector, наконец-то! А для того, чтобы понимать, нужно исследовать перегрузку оператора сравнения для классов используемых объектов. А если этот код писало десять человек три года назад, быстрее будет без всякого полиморфизма написать свое сравнение, чем копаться в тысячах строках кода, врубаясь, подходит реализованная кем-то когда-то перегрузка для данного случая или нет.
Даже в описанном мной классическом случае совершенно неоднозначно, требуется сравнение указателей или строк. Иногда важно одно, иногда - другое.
Я нигде не писал "плохой", в отличии от Вас. Я только пытаюсь предупредить читателей данной темы, особенно новичков, что ad-hoc полиморфизм в C++ имеет весомые недостатки. Его использовать допустимо только хорошо отдавая себе отчет, что вернувшись к своему же коду через год-другой понадобится углубляться в изучение реализации всех перегрузок давно забытого кода.
В общем случае, лучше начинающим вообще на C++ полиморфизмом не увлекаться. Код будет прозрачней и проще.
Даже в описанном мной классическом случае совершенно неоднозначно, требуется сравнение указателей или строк. Иногда важно одно, иногда - другое.
Я нигде не писал "плохой", в отличии от Вас. Я только пытаюсь предупредить читателей данной темы, особенно новичков, что ad-hoc полиморфизм в C++ имеет весомые недостатки. Его использовать допустимо только хорошо отдавая себе отчет, что вернувшись к своему же коду через год-другой понадобится углубляться в изучение реализации всех перегрузок давно забытого кода.
В общем случае, лучше начинающим вообще на C++ полиморфизмом не увлекаться. Код будет прозрачней и проще.
Re: Вопросы по С/С++ (СИ)
Лучше на бейсик.Reflector писал(а):все дружно перебираемся на паскаль?
Re: Вопросы по С/С++ (СИ)
Мурик, тебе давно пора. Сидел на барсиках и нечего было слезать. Только СД мог такое за переход на барсик ляпнуть...
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="Reflector",url="/forum/viewtopic.php?p=3709209#p3709209"]Как ты на С будешь делать подобные проверки?[/uquote]
Не буду. Это - блажь!
Не буду. Это - блажь!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3709344#p3709344"]Так что будет сравнивать полиморфный шаблон? Указатели или то, на что они указывают? А если речь будет уже о сложных объектах, с тысячами срок кода их реализации?[/uquote]Средства языка позволяют понять что за тип передаётся в шаблон и либо подобрать ему соответствующий метод сравнения, либо assert-нуть. Если программист этого не сделал, то он ССЗБ.
Добавлено after 7 minutes 10 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3709507#p3709507"]Не буду. Это - блажь![/uquote]Ваше мнение очень важно для нас!
Добавлено after 7 minutes 10 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3709507#p3709507"]Не буду. Это - блажь![/uquote]Ваше мнение очень важно для нас!
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
VladislavS, и что будет сравниваться в моем простейшем примере? )))
Re: Вопросы по С/С++ (СИ)
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3709595#p3709595"]и что будет сравниваться в моем простейшем примере? )))[/uquote]
Если бы изначально в С параллельно с char существовал еще один 8-ми битный тип, условный byte, и char использовался только для строк, то max() принимая char* могла бы исходить из того, что это строки, сравнивать их нужно как строки и нет никаких проблем. Внимание вопрос: а при чем тут параметрический полиморфизм на мономорфном ядре?
Ты пытаешься убедить, что проблема в С++, т.к. полиморфизм там какой-то недоделанный, но даже идеальная реализация полиморфизма бесполезна когда нельзя сказать строка перед нами или что-то другое...
Если бы изначально в С параллельно с char существовал еще один 8-ми битный тип, условный byte, и char использовался только для строк, то max() принимая char* могла бы исходить из того, что это строки, сравнивать их нужно как строки и нет никаких проблем. Внимание вопрос: а при чем тут параметрический полиморфизм на мономорфном ядре?
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Reflector, я никого не убеждаю, я просто констатирую факт, что в С++ нет параметрического полиморфизма, как, например, в ML. Вместо этого есть синтаксический сахар ad-hoc полиморфизма поверх мономорфного ядра. Именно из этого мономорфного ядра и проистекают все недостатки полиморфизма в C++. Полиморфизм в C++ не может быть "доделанным". Для этого нужно сменить ядро языка на полиморфное, но тогда это будет уже другой язык )
Добавлено after 18 minutes 38 seconds:
P.S. У меня складывается ощущение, что многие просто не понимают, что такое полиморфизм. На удивление, в Вики очень неплохая статья по этому поводу.
Добавлено after 18 minutes 38 seconds:
P.S. У меня складывается ощущение, что многие просто не понимают, что такое полиморфизм. На удивление, в Вики очень неплохая статья по этому поводу.
Re: Вопросы по С/С++ (СИ)
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3709639#p3709639"]У меня складывается ощущение, что многие просто не понимают, что такое полиморфизм.[/uquote]
У меня не просто ощущение, я на все 100% уверен, что некоторые не понимают даже что такое синтаксический сахар
У меня не просто ощущение, я на все 100% уверен, что некоторые не понимают даже что такое синтаксический сахар
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Reflector, тоже поделюсь ссылкой на статью в Вики.
Даже процитирую определение оттуда:
Даже процитирую определение оттуда:
Под «синтаксическим сахаром» понимается любой имеющийся в языке программирования синтаксический элемент, механизм, способ описания, который дублирует другой, имеющийся в языке элемент или механизм, но является более удобным в использовании, или более краток, или выглядит естественнее, или более привычен (похож на аналогичные элементы других языков), или просто лучше воспринимается при чтении программы человеком. Принципиально то, что синтаксический сахар, теоретически, всегда можно удалить из языка без потери его возможностей — всё, что можно написать с применением синтаксического сахара, может быть написано на этом же языке и без него. Таким образом, синтаксический сахар предназначен лишь для того, чтобы сделать более удобным для программиста написание программы.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
в таком случае, всё, кроме оператора if и goto, является синтаксическим сахаром, ибо любой алгоритм реализуется в этом базисе операторов (не считая операторов элементарной арифметики и присваивания).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
ARV, а Вы не знали? В той же статье, на которую я давал ссылку, даже пример есть:
Например, в языке C и его потомках имеются операторы увеличения и уменьшения (++, --, +=, -= и т. п.). Введение этих операторов в язык было вызвано необходимостью поддержки ручной оптимизации программ, так как код с их использованием мог транслироваться в более эффективные машинные команды («++a» транслировалось в одну команду INC, а аналогичное выражение «a=a+1» — в целую группу команд). Развитие технологии оптимизации кода сделало подобную ручную оптимизацию бессмысленной; сейчас компиляторы порождают одинаковый код для «длинного» и «короткого» варианта операции. В результате сокращённые операторы превратились в синтаксический сахар, хотя изначально им не были.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
про то, что это называется сахаром, не знал. а о том, что минимальный базис операторов языка - это оператор перехода и оператор ветвления по условию - знал.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
ARV, но тогда почему плюсанули сообщение Reflector? Ведь он, получается, бросил камень, в том числе, и в Ваш огород?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Мне правда глаз не колет 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Подскажите как красиво сделать такую вещь. Есть тип направление:
И вот нужно вычислить его изменение приповороте направо или на лево.
Если в цифрах то направо (x +1) & 0x03, налево, соответственно, (x-1) &0x03. Но компилятор ругается на смешивание типов. Как это сделать красиво?
Код: Выделить всё
typedef enum {
north = 0,
east = 1,
south =2,
west =3}
Если в цифрах то направо (x +1) & 0x03, налево, соответственно, (x-1) &0x03. Но компилятор ругается на смешивание типов. Как это сделать красиво?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
x++ или x-- ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="uldemir",url="/forum/viewtopic.php?p=3711136#p3711136"]Как это сделать красиво?[/uquote]Надо делать не красиво, а правильно. Явное приведение типов делать надо. Ты же не просто ради дефайна констант enum применил, правда?
[uquote="ARV",url="/forum/viewtopic.php?p=3711137#p3711137"]x++ или x-- ?[/uquote]Кхм, не будет так работать. Зато красиво то как
[uquote="ARV",url="/forum/viewtopic.php?p=3711137#p3711137"]x++ или x-- ?[/uquote]Кхм, не будет так работать. Зато красиво то как
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
uldemir, а вам обязательно enum? Просто объявите направление движения типом int (скажем, int8_t), задефайните основные направления, а после каждой процедуры изменения делайте проверку вроде
Вот и все!
Код: Выделить всё
int rotate(int olddir, int angle){
olddir += angle;
olddir %= 4;
if(olddir < 0) olddir += 4;
return olddir;
}
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3711208#p3711208"]задефайните основные направления,[/uquote]Ну он это и сделал enum-ом.