LINUX.ORG.RU

Си с классами

 , ,


0

7

Тупнячка принёс, извиняйте.

Начинаю проект (личный), выбираю на чём писать: C или C++.

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

Хотелось бы какой-то сабсет C++ или суперсет над C. Чтобы библиотеки плюсовые можно было при необходимости заюзать, класс-другой написать, а то и во все тяжкие пуститься, обмазавшись строками. Но без хардкорного плюсового упорина от которого у одних глаза с первого взгляда вытекают, а другие в дурке после прочтения оказываются.

Насколько такой суперсет C / сабсет C++ ака «Си с классами» может быть кошерен?

Объясните почему так делать не стоит, либо даже наоборот, предложите уже существующие сабсеты плюсов, которые можно перенять.

Ответ на: комментарий от WitcherGeralt

Кстати, что мне очень нравится в линейке Pascal - процедурный тип. Это реально круто.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от anonymous

В шланге есть частично. Но зачем ограничивать себе протухшими стандартами, тем более если код для себя.

invy ★★★★★
()
Ответ на: комментарий от slackwarrior

Новые стандарты - как раз в направлении юзабилити идут. Там вон адекватный полиморфизм обещают.

invy ★★★★★
()
Ответ на: комментарий от invy

Все это конечно классно, но если он не пишет на с++ ему и надо начинать с некрофилии, чтобы понять почему эти новые стандарты вышли и что в них поменялось. constexpr, auto, rvalue reference, etc ввели еще в 11 версии без понимания и опыта работы на 11+ нет смысла соваться в 14 17 20, не говоря уже что от stl не убежать если ты собираешься писать именно на с++ и использовать его готовые удобства, а иначе он нахер не нужен если все равно самому все писать. Одна из причин почему кресты говно тащемта, можно конечно отбросить все и сразу начать говнякать на 20, но это аукнется обязательно.

anonymous
()

бери с++20 с концепциями, корутинами и ренжами. игнорируй всё из с++17, сфинае, не пиши упоротые шаблоны, вообще шаблоны старайся не писать, и всё будет ок.

концепции уже вроде работают, ренжи тоже есть, корутины ещё не подъехали, но в будущем пригодятся, генераторы там всякие, всё такое. ещё будет проще потом перелезть на экзекюторы и т.д. потом ещё модули затащишь.

бери или стандартные вещи, или те которые максимально похожи на стандартные чтобы потом было меньше переписывать. старайся больше сделать на стандартной библиотеке, а не на зависимостях.

от упорина правило очень простое: если код не хочется читать, то удаляешь этот код и переписываешь по-нормальному. от ревизии языка это не зависит.

вообще это называется «консервативный с++». стек надо брать новый, но не обмазываться им всем, а применять только там где это необходимо и даёт какую-то выгоду, а не потому что «я так вижу».

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

работать в рамках ревизии - это тоже скил, даже в определённой мере искусство. иногда надо портировать с с++17 на с++14, а не наоброт, например. научишься так делать - будешь годным плюсером.

но бери ревизию поновее, всё таки с++11 скоро 10 лет уже. с++20 тебе на дольше хватит.

anonymous
()
Ответ на: комментарий от anonymous

старайся больше сделать на стандартной библиотеке, а не на зависимостях.

всм «а не на своём саписном велосипеде». смысл такой: если тебе кажется, что в стандартной библиотеке чего-то не хватает и надо дописать, то я рад тебе сообщить, что там и так полно всякого барахла и скорее всего ты что-то подберёшь.

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

anonymous
()

Личный проект я бы на дишечке нафигачил. Хотя нет, вру. Мне сейчас vulkan интересен, такое по ощущениям сподручнее колхозить на крестах.

Hertz ★★★★★
()
Ответ на: комментарий от eao197

А что есть «адекватный полиморфизм»?

Мономорфизм

anonymous
()
Ответ на: комментарий от invy

Никто и не запрещает ими пользоваться — другое дело что это все не то чтоб «маст хэв», особенно пока его не обкатали на подопытных любителях «всего красивого». Либо оно работает для кого-то, либо этим можно спокойно не пользоваться, пока оно не достигнет «зрелости», как любым другим «сахарком». Это у хипсторов «ааа, тут джва года нет новых фич, все мертвое!», взрослые люди обычно реагируют «наконец-то хипсторы отсюда ушли, можно работать» — молоток наконец-то приобрел законченый вид и перестал неожиданно меняться, а в продакшоне «все самое новое и прогрессивное» — вообще редкость.

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Никто и не запрещает ими пользоваться — другое дело что это все не то чтоб «маст хэв»

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

Вот в C++14 – это автоматический вывод типа функции (т.е. полноценный auto без уточнения типа возвращаемого значения после списка аргументов, как в C++11). Ну и полиморфные лямбды до кучи (хотя их можно было в C++11 через функторы эмулировать, но то прям как возврат к временам C++98 осщущался).

В C++17 – это if constexpr. И [[nodiscard]].

В C++20, как минимум, spaceship operator.

Т.е. в каждом стандарте были штуки, очень полезные на практике, которые не требовали какой-то предварительной обкатки.

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

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

Так какой из видов полиморфизма в C++ для вас требует аллокаций?

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Учитывая что их всего два, то догадается не сложно.

Лично я в C++ постоянно сталкиваюсь с тремя.

Так что в догадках теряюсь. Просветите, плиз.

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

очевидно было предположить статический и динамический

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

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Вы умеете аллоцировать не только память?

Я просто теряюсь в догадках, что умеете аллоцировать вы.

Память в ro и rw секция вы тоже «аллоцируете»? А на стеке? Какие еще аллокации вам нужны для

static MyClass myObj;

и

f() {
    MyClass myObj;
    ...

?

wandrien ★★
()
Ответ на: комментарий от wandrien

Речь шла про полиморфизм.

Да, на стеке память тоже аллоцируется. Реализация отличается от кучи, но суть не меняется.

Статические переменные тоже аллоцируются, если что.

RazrFalcon ★★★★★
()

Берёшь плюсы и пользуешься в режиме си с классами. Для особого коленкору можешь оторвать эксепшены целиком.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от anonymous

вообще шаблоны старайся не писать, и всё будет ок.

вредный совет. Я бы даже обратный будет более полезен.

«Старайся писать шаблоны, и всё будет ок.»

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

сколько таких примеров показывали, типа смотрите вот он Rust, спаситель: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=54de71d6a3ac465f297177907c64e9cb

Но такое поведение всегда было в С++, в шаблонах:

https://gcc.godbolt.org/z/GYj3jc

fsb4000 ★★★★★
()
Ответ на: комментарий от RazrFalcon

динамический полиморфизм … без аллокаций

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

anonymous
()
Ответ на: комментарий от RazrFalcon

А если на Си делать динамическую диспетчеризацию, то она через libastral работает, не аллоцируя память под vtable. Ага-ага.

wandrien ★★
()
Ответ на: комментарий от fsb4000

Но такое поведение всегда было в С++, в шаблонах

уже бы тогда на is_same пример делал

anonymous
()
Ответ на: комментарий от RazrFalcon

К полиморфизму динамическая аллокация памяти не имеет отношения от слова совсем. Что и было показано на примере.

И да, на практике подобные вещи применяются. Например, для реализации синглетонов. Так что мы все еще говорим про реальный код.

А вот вы хоть чем-нибудь свои слова подтвердить можете?

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

std::vector … struct S { Base base; }

Скоро введут новые типы «полиморфизма» - с счетчиком ссылок и без счетчика ссылок, с циклами и без. Но память как текла, так и будет течь.

anonymous
()
Ответ на: комментарий от RazrFalcon

Еще раз: в C++ из трех видов регулярно мной используемых полиморфизмов ни один не требует использования динамической аллокации.

Для реализации не требует.

Что и было показано.

К демонстрации претензии есть?

А вот к вашим утверждениям «без аллокаций и шаблонов» все прежние вопросы остались.

И еще добавился новый: как вы в C++20 получите vector<Base> посредством «адекватного полиморфизма», про который вы решили вставить свои две копейки?

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от eao197

Ты просто поюзал конструктор по умолчанию и механизм выделения памяти под инстанс в рамках языка, это не говорит о том, что она перестала выделяться, и уж тем более не говорит о том что инстанс будет не на хипе. Какой-то дешевый трюк ярмарочного шарлатана, принести этот недокод без всех остальных конструкторов с которыми он хоть как-то может использоваться чтобы отбрехаться. Аллокация будет произведена, просто не руками программиста в его коде.

what.f(); // Dynamic polymorphism happens here!

Как раз по причине того что рантайм и убогая скриптуха в динамике. Это не доказало ничего, лишь только подтвердило взаимосвязь аллокации и возможности жизни скриптухи.

anonymous
()
Ответ на: комментарий от anonymous

надо писать auto и указывать концепцию.

да, концепты хорошая штука: https://gcc.godbolt.org/z/qe4519

просто тот пример работал с флагом -st=c++98, если закомментировать с++11 часть, и убрать комментарии у с++98 части.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

А теперь соорудите мне std::vector или struct S { Base base; }.

Мимо. Объяснения уже были даны выше.

Вы на поставленные вопросы таки ответите или флакон в очередной раз разорван?

eao197 ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Как чувствует себя Go в системном программирование ? — тут полтреда про оберон.

Выбор первого языка (комментарий)

До этого ещё один регистрант про оберон телегу толкал несколько дней назад, и кто-то из под анонимуса.

WitcherGeralt ★★
() автор топика
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.