Для меня основной минус с++ от которого хотелось бы избавиться — это дублирование кода.
Приходиться одно и тоже писать (название функций) в h и в cpp файлах. И менять тоже нужно в двух местах.
1) я пробовал писать всё в h файле (т.е. и тело функций), но тогда возникают проблемы:
1.1 — если класс A использует класс B и класс B использует класс A — что очень часто бывает в больших проектах. Тогда приходится некоторые функции выносить в cpp.
1.2 — проблемы с #define, т.е. если #define определён в cpp после #include, он действует только в одном cpp (обычно один файл cpp = один класс). Если определить #define в h, он будет действовать на все классы которые включены после данного файла.
Может быть данные проблемы уже как-то решены, но я об этом не знаю ?
Если нет, может сделать предкомпилятор, который из одного файла (где объявление и реализация) создаст 2 файла h+cpp, которые будут компилироваться.
Здравствуйте, maks1180, Вы писали:
M>1.2 — проблемы с #define, т.е. если #define определён в cpp после #include, он действует только в одном cpp (обычно один файл cpp = один класс). Если определить #define в h, он будет действовать на все классы которые включены после данного файла.
#define желательно не использовать лишь в пределах одной единицы трансляции, т.к. это может сломать ODR.
И вообще желательно обойтись другими средствами метапрограммирования. Шаблоны, constexpr функции, if constexpr...
Здравствуйте, maks1180, Вы писали:
M>1) я пробовал писать всё в h файле (т.е. и тело функций), но тогда возникают проблемы: M>1.1 — если класс A использует класс B и класс B использует класс A — что очень часто бывает в больших проектах. Тогда приходится некоторые функции выносить в cpp.
Включать они друг друга явно не могут, значит, могут использовать по указателю/ссылке. Для этого достаточно сделать forward declaration для одного из этих классов
M>1.2 — проблемы с #define, т.е. если #define определён в cpp после #include, он действует только в одном cpp (обычно один файл cpp = один класс). Если определить #define в h, он будет действовать на все классы которые включены после данного файла.
Нет такой проблемы. Если define объявлен в cpp после инклудов, то это явно какой-то локальный define. Если макрос определён в хидере — то он явно предназначен для использования где угодно. С макросами только одна проблема — у них нет пространств имён. Это решается просто длинным именем с префиксом модуля/библиотеки etc. Макросы же, которые определяют конфигурацию сборки — обычно никто не задаёт в cpp файлах, они передаются компилятору в командной строке. Еще вариант, когда таких макросов много — запихать их в один хидер, и сказать компилятору сделать preinclude данного файла — т.е. включать его перед всем остальным для каждой единицы трансляции
M>Может быть данные проблемы уже как-то решены, но я об этом не знаю ?
Похоже, что не знаешь. Хотя вроде бы давно уже в отрасли, у тебя же какой-то проект с удалённым десктопом или что-то такое, нет?
M>Если нет, может сделать предкомпилятор, который из одного файла (где объявление и реализация) создаст 2 файла h+cpp, которые будут компилироваться.
Здравствуйте, maks1180, Вы писали:
M>Для меня основной минус с++ от которого хотелось бы избавиться — это дублирование кода. M>Приходиться одно и тоже писать (название функций) в h и в cpp файлах. И менять тоже нужно в двух местах.
Какой ты счастливый человек, что это для тебя является основным минусом
Кстати, менять названия функций и перемеренных лучше средствами рефакторинга, а не ручками.
Здравствуйте, maks1180, Вы писали:
M>Для меня основной минус с++ от которого хотелось бы избавиться — это дублирование кода. M>Приходиться одно и тоже писать (название функций) в h и в cpp файлах. И менять тоже нужно в двух местах.
Мелкие функции имеет смысл писать в заголовках для инлайнинга, а для больших дублирование объявлений не даёт заметную проблему.
M>1) я пробовал писать всё в h файле (т.е. и тело функций), но тогда возникают проблемы: M>1.1 — если класс A использует класс B и класс B использует класс A — что очень часто бывает в больших проектах. Тогда приходится некоторые функции выносить в cpp.
Ещё можно сделать абстрактный класс с нужными функциями в роли интерфейса.
M>1.2 — проблемы с #define, т.е. если #define определён в cpp после #include, он действует только в одном cpp (обычно один файл cpp = один класс). Если определить #define в h, он будет действовать на все классы которые включены после данного файла.
Если это не что-то радикальное вроде макры RB_PROTOTYPE, то const/constexpr выгоднее тем, что имеет пространство имён.
Если радикальное, ему можно дать имя с длинным префиксом и затем #undef в конце заголовочника.
M>Может быть данные проблемы уже как-то решены, но я об этом не знаю ?
А это проблемы? Ну я понимаю, что половина использующих C++ реально пишет на "C с классами", но это как-то не очень тематично...
Здравствуйте, maks1180, Вы писали:
M>Для меня основной минус с++ от которого хотелось бы избавиться — это дублирование кода.
Вы счастливый человек.
M>Приходиться одно и тоже писать (название функций) в h и в cpp файлах. И менять тоже нужно в двух местах.
Как же мучаются писатели составляя оглавление и предметные указатели.
Здравствуйте, maks1180, Вы писали:
M>Для меня основной минус с++ от которого хотелось бы избавиться — это дублирование кода. M>Приходиться одно и тоже писать (название функций) в h и в cpp файлах. И менять тоже нужно в двух местах.
Современные IDE умеют одним кликом мышки заводить новые классы, добавлять новые функции и члены класса сразу и в хедерах и в исходниках. Так же переименовывать сразу во всех исходниках (у них это в разделе "Рефакторинг" в выпадающем меню)
Здравствуйте, maks1180, Вы писали:
M>Для меня основной минус с++ от которого хотелось бы избавиться — это дублирование кода. M>Приходиться одно и тоже писать (название функций) в h и в cpp файлах. И менять тоже нужно в двух местах.
В смысле писать ?
Сегодня любые IDE это делают за вас.
Пишете один раз в заголовке и в один щелчок появляется заготовка в cpp файле.
Также если нужно изменить прототип, меняем один раз, а IDE уже сама поменяет везде, где надо.
Здравствуйте, sergii.p, Вы писали:
SP>так в системах вёрстки здорового человека (latex например) оглавление и предметные указатели формируются автоматически.
Ага после нескольких проходов
M>Современные IDE умеют одним кликом мышки заводить новые классы, добавлять новые функции и члены класса сразу и в хедерах и в исходниках. Так же переименовывать сразу во всех исходниках (у них это в разделе "Рефакторинг" в выпадающем меню)
Это да:
1) часто на сервере нужно править исходники. Там только текстовый терминал.
2) современные IDE, часто имеет проблемы если использовать макросы или шаблоны.
3) Я привык клавитатурой работать быстро, а тут нужно мышкой править через IDE — это дольше и неудобнее.
4) И намного удобнее когда 1 файл = 1 класс.
Для меня основной минус C# от которого хотелось бы избавиться — это чудовищная организация кода.
Открываешь файл — там класс на 1K+ строчек, и понять, что вообще там за методы или свойства есть — никакого способа нет, кроме как исследовать код через IDE (при чём во всех это сделано через неудобно).
В общем, минус .h файлов — он же и его плюс. Если .h файлы хорошо оформлены — то с таким кодом, очень приятно работать.
Здравствуйте, maks1180, Вы писали:
M>>Современные IDE умеют одним кликом мышки заводить новые классы, добавлять новые функции и члены класса сразу и в хедерах и в исходниках. Так же переименовывать сразу во всех исходниках (у них это в разделе "Рефакторинг" в выпадающем меню)
M>Это да: M>1) часто на сервере нужно править исходники. Там только текстовый терминал.
Берём VSCode поверх SSH.
Или VIM/NeoVIM с плагинами.
M>2) современные IDE, часто имеет проблемы если использовать макросы или шаблоны. M>3) Я привык клавитатурой работать быстро, а тут нужно мышкой править через IDE — это дольше и неудобнее.
Все IDE умеют горячие клавиши и работу с клавиатурой.
К тому же везде ещё есть и режим VIM если очень нужно.
M>4) И намного удобнее когда 1 файл = 1 класс.
Ну это вам язык менять надо. C/C++ так не работают.
M>Для меня основной минус с++ от которого хотелось бы избавиться — это дублирование кода. M>Приходиться одно и тоже писать (название функций) в h и в cpp файлах. И менять тоже нужно в двух местах.
Я с этим столкнулся еще в 1992 году...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Mystic Artifact, Вы писали:
MA>Открываешь файл — там класс на 1K+ строчек, и понять, что вообще там за методы или свойства есть — никакого способа нет, кроме как исследовать код через IDE (при чём во всех это сделано через неудобно).
в студии Ctrl M + O Collapse To Definitions. Получаем просто h файл.