- 1
- 2
- 3
Если у меня есть приватный метод, то зачем мне его объявлять в .h-файле?
Хочу только в .cpp написать вспомогательный метод и только там его использовать.
А вынужден копипастить сигнатуру ещё и в .h.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
Если у меня есть приватный метод, то зачем мне его объявлять в .h-файле?
Хочу только в .cpp написать вспомогательный метод и только там его использовать.
А вынужден копипастить сигнатуру ещё и в .h.
ООП гоавно
Я бы вообще вынес всё в свободные функции и передавл зис, если не нужно приватных полей.
Ладно, давай дожемся Борманда и ISO
Пока ООПушки решают какие-то выдуманные проблемы, сишники пишут код
class my_genius_class_impl;
class my_genius_class
{
...
private:
my_genius_class_impl *_pimpl;
...
}
Все приватное пихаешь в my_genius_class_impl и описываешь и используешь в скрытых cpp и hpp.
Ого, я наговнокодил в комментах!))
http://govnokod.ru/page/bbcode
Оп, оп, джава-стайл.
Минус такой же как у пимпла -- надо кучу и лишняя индирекция.
Я ненавижу pimpl не за кучу, а за ненужную вложенность вызовов.
С интерфейсами класс надо таскать по указателю, как в джаве. Зато кишки не разбросаны и можно сделать несколько реализаций.
А ты не вкладывай. Считай, что импл -- это просто структурка с полями и хелперами. Никто не заставляет делать "красиво" и проксировать вызовы в импл.
Переведи на то, что ты предлагаешь. Я не понимаю.
Impl не обязан быть классом с полноценной инкапсуляцией, он наружу не торчит
Ясно. Для меня то это один хуй.
Именно потому я за "питон" (нет)
В общем-то даже в джаве не парятся и разрешают доступ из всех соседей по пакету.
Но вообще я бы так сказал: приватно всё, что не документировано. Насиловать язык чтобы сэмулировать приватность и правда не всегда нужно
У нас в ``Erlang'', кстати, правильная инкапсуляция.
Чтобы я случайно в чужой класс не влез?
В итоге ты инклудишь какую-то хуйню ради своего приватного поля, а она теперь торчит всем клиентам, замедляет конпеляцию и может что-то сломать.
Почему не разрещить .cpp файлу добавить любой метод, если в .h файле явно указать его как имеюшщий на такое право?
Переходи на "D".
На PHP не переводи́м
какой багор
Никакого дублирования, топовый пирфоманс, никаких проблем с разбиением на аш и цпп.
кроме кода в .o?
И скомпилируются два раза
> тебя один main.cpp, всё остальное в хедерах.
аааа, гггг
ну ок
За одно нет проблемы с системой сборки: не нужно никакие сложные файлы писать
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке?
Его? В бусте вон тыщи хедеров которым не нужны цппшки. Никто не мешает разбивать код по разным хедерам.
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке?
Можно сделать такой API для плагинов, и писать их в виде hpp
Это ваш мозг на крестах.
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке?
Используя PHP в качестве препроцессора — да.
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке??
find вообще мощная питушня очень
Правда я вообще не помню его опции, обычно просто высираю список файлов и другими тулами обрабатываю (i.e. find | grep). Поэтому -printf сразу в голову не пришёл.
Он умеет несколько условий по OR или AND объединять например
https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html
https://gcc.godbolt.org/z/hv33eT7jd
Единственная проблема — прокинуть в публичный интерфейс размер и выравнивание приватного питуха. А так — полный зирокост.
а не придеца потом пересобирать всё когда размер внутреннего питуха изменица?
Собственно, если ты не используешь такой «pimpl» и изменяешь публичный класс — тебе всё равно придётся всё пересобирать.
Впрочем, API не сломается, так что выпускать новый .h не придется
Но клиента нужно будет перебрать
или нет?
API тоже сломается: размер публичного-то петуха тоже изменится.
Тогда хуярь всё в .hpp.
> std::aligned_storage_t
> new (&impl)
> alignof
> void*
> noexcept
Выебнулся, молодец. В моём коде такой хуйни нет.
Без плейсмент нью ты никак не
1505407
https://govnokod.xyz/_27655/#comment-658861
Здеся не объявлять kok() в h-нике.
Можно сделать pimpl как с указателем, так и без него. Тогда приватные методы не нужно описывать в .h. Но исходную проблему (количество кода) это не решает.
«private_kukareku()» — это и есть твой «kok».
> количество кода
Если твоя проблема именно в количестве кода — то тебе действительно нужно описывать весь класс в .hpp. Меньше ты в любом случае никак не сделаешь.
Я меняю сигнатуру приватного метода и мне нужно подправить это в двух местах, когда этого можно было избежать.
Потому что компилятор должен иметь возможность скомпилировать твой класс исключительно по его объявлению. Грубо говоря, .h-файл — это не только API, а ещё и ABI. Без объявления приватных членов ABI объявить невозможно без грязных хаков.
В том числе, да.
> А если вместо приватных методов и полей в хедере написать foo, bar, baz, чтобы секреты не раскрывать?
Какая обфусцированная «Java» )))
?
P.S. А ещё у меня там тупая утечка — помнил о ней, но забыл поправить перед постингом. Какой багор )))
Для твоей задачи он, возможно, и лучше.
Чем мой пример не подходит?
И тут мы опять приходим к вопросу - писать в одном impl.hpp, или разносить в .cpp. Тогда нахуй оно надо?
* Против «IDA Pro» нет приёма.
А ты указал, что у тебя тут будет некое говно вручную предпосчитанного размера (без инклуда).
Прыжок в середину инструкции.
** Такой прыжок невозможен в RISC-процессорах и в процессорах, требующих выравнивания адреса перехода.
*** Но у некоторых RISC-процессоров, таких как "ARM" с набором инструкций "thumb-2" таки возможен. Правда х.з. получится ли там что-то разумное и полезное.
Два реальных примера коллизий.
И у MIPS16, и даже у тех, который имеют слово RISC прямо в названии.
Реальный пример:
https://govnokod.ru/20245#comment335899
я об этом писал.
«IDA Pro» дизассемблирует только одну из веток: либо исходную функцию с mov, либо сгенерированный нами опкод.
Но у неё в названии не просто так есть буква "I". Так что в отличие от автоматических дизасмов ты всегда можешь переключиться между этими ветками.
Это проблема «IDA Pro». Дизассемблировать можно по всем возможным смещениям, и визуализировать это как-то так https://i.imgur.com/LvuS6Zt.png