- 1
- 2
- 3
Если у меня есть приватный метод, то зачем мне его объявлять в .h-файле?
Хочу только в .cpp написать вспомогательный метод и только там его использовать.
А вынужден копипастить сигнатуру ещё и в .h.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
Если у меня есть приватный метод, то зачем мне его объявлять в .h-файле?
Хочу только в .cpp написать вспомогательный метод и только там его использовать.
А вынужден копипастить сигнатуру ещё и в .h.
3_dar 10.09.2021 15:50 # 0
Soul_re@ver 10.09.2021 15:54 # +2
guest6 10.09.2021 15:56 # +1
ООП гоавно
guest6 10.09.2021 15:53 # +1
3_dar 10.09.2021 15:56 # 0
guest6 10.09.2021 15:58 # 0
guest6 10.09.2021 16:00 # 0
guest6 10.09.2021 16:02 # +1
Я бы вообще вынес всё в свободные функции и передавл зис, если не нужно приватных полей.
Ладно, давай дожемся Борманда и ISO
Soul_re@ver 10.09.2021 16:08 # +1
guest6 10.09.2021 16:13 # +4
Пока ООПушки решают какие-то выдуманные проблемы, сишники пишут код
bormand 10.09.2021 16:26 # +2
ASD_77 10.09.2021 18:57 # 0
guest6 10.09.2021 19:16 # +2
Soul_re@ver 10.09.2021 19:17 # +3
guest6 10.09.2021 19:30 # 0
bormand 10.09.2021 16:35 # +2
JloJle4Ka 11.09.2021 04:00 # +1
somebyte 10.09.2021 16:18 # 0
class my_genius_class_impl;
class my_genius_class
{
...
private:
my_genius_class_impl *_pimpl;
...
}
Все приватное пихаешь в my_genius_class_impl и описываешь и используешь в скрытых cpp и hpp.
Ого, я наговнокодил в комментах!))
guest6 10.09.2021 16:25 # 0
somebyte 10.09.2021 16:27 # 0
guest6 10.09.2021 16:34 # 0
http://govnokod.ru/page/bbcode
somebyte 10.09.2021 16:50 # 0
bormand 10.09.2021 16:30 # 0
Оп, оп, джава-стайл.
Минус такой же как у пимпла -- надо кучу и лишняя индирекция.
guest6 10.09.2021 16:34 # 0
Я ненавижу pimpl не за кучу, а за ненужную вложенность вызовов.
bormand 10.09.2021 16:38 # 0
С интерфейсами класс надо таскать по указателю, как в джаве. Зато кишки не разбросаны и можно сделать несколько реализаций.
guest6 10.09.2021 16:39 # 0
bormand 10.09.2021 16:48 # 0
А ты не вкладывай. Считай, что импл -- это просто структурка с полями и хелперами. Никто не заставляет делать "красиво" и проксировать вызовы в импл.
guest6 10.09.2021 16:49 # 0
guest6 10.09.2021 16:51 # 0
Переведи на то, что ты предлагаешь. Я не понимаю.
bormand 10.09.2021 16:53 # 0
Impl не обязан быть классом с полноценной инкапсуляцией, он наружу не торчит
guest6 10.09.2021 16:55 # +1
Ясно. Для меня то это один хуй.
JloJle4Ka 10.09.2021 16:59 # +1
guest6 10.09.2021 17:02 # +1
Именно потому я за "питон" (нет)
bormand 10.09.2021 17:05 # +1
В общем-то даже в джаве не парятся и разрешают доступ из всех соседей по пакету.
guest6 10.09.2021 17:09 # +1
Но вообще я бы так сказал: приватно всё, что не документировано. Насиловать язык чтобы сэмулировать приватность и правда не всегда нужно
CHayT 10.09.2021 17:08 # +1
У нас в ``Erlang'', кстати, правильная инкапсуляция.
bormand 10.09.2021 17:09 # 0
guest6 10.09.2021 17:11 # 0
CHayT 10.09.2021 17:11 # +1
bormand 10.09.2021 17:11 # +1
guest6 10.09.2021 16:38 # 0
Чтобы я случайно в чужой класс не влез?
bormand 10.09.2021 16:42 # 0
В итоге ты инклудишь какую-то хуйню ради своего приватного поля, а она теперь торчит всем клиентам, замедляет конпеляцию и может что-то сломать.
guest6 10.09.2021 16:47 # 0
Почему не разрещить .cpp файлу добавить любой метод, если в .h файле явно указать его как имеюшщий на такое право?
bormand 10.09.2021 16:50 # +1
guest6 10.09.2021 16:52 # +1
ASD_77 10.09.2021 20:53 # +1
ASD_77 11.09.2021 01:45 # 0
j123123 11.09.2021 03:50 # +1
j123123 11.09.2021 04:40 # +3
Переходи на "D".
JloJle4Ka 11.09.2021 05:35 # 0
OCETuHCKuu_nemyx 13.09.2021 00:13 # 0
Desktop 13.09.2021 00:15 # +1
На PHP не переводи́м
ASD_77 11.09.2021 01:44 # +1
guest6 10.09.2021 16:47 # +1
какой багор
bormand 10.09.2021 17:07 # +3
Никакого дублирования, топовый пирфоманс, никаких проблем с разбиением на аш и цпп.
guest6 10.09.2021 17:09 # 0
кроме кода в .o?
bormand 10.09.2021 17:10 # +2
guest6 10.09.2021 17:12 # 0
И скомпилируются два раза
bormand 10.09.2021 17:14 # 0
guest6 10.09.2021 17:14 # +1
> тебя один main.cpp, всё остальное в хедерах.
аааа, гггг
ну ок
Soul_re@ver 10.09.2021 17:11 # +3
guest6 10.09.2021 17:13 # +1
За одно нет проблемы с системой сборки: не нужно никакие сложные файлы писать
3_dar 10.09.2021 21:49 # +2
guest6 10.09.2021 21:55 # +2
CHayT 10.09.2021 21:57 # +3
guest6 10.09.2021 22:12 # 0
ISO 10.09.2021 22:15 # 0
CHayT 10.09.2021 22:16 # +1
ISO 10.09.2021 22:15 # 0
CHayT 10.09.2021 22:16 # +1
guest6 10.09.2021 22:17 # +1
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке?
CHayT 10.09.2021 22:16 # 0
bormand 10.09.2021 22:05 # +3
Его? В бусте вон тыщи хедеров которым не нужны цппшки. Никто не мешает разбивать код по разным хедерам.
guest6 10.09.2021 22:12 # 0
ISO 10.09.2021 22:15 # 0
CHayT 10.09.2021 22:16 # +1
guest6 10.09.2021 22:17 # 0
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке?
ISO 10.09.2021 22:18 # 0
guest6 10.09.2021 22:19 # 0
Можно сделать такой API для плагинов, и писать их в виде hpp
CHayT 10.09.2021 22:21 # +3
Это ваш мозг на крестах.
ISO 10.09.2021 22:15 # 0
CHayT 10.09.2021 22:16 # +1
guest6 10.09.2021 22:16 # 0
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке?
CHayT 10.09.2021 22:18 # +3
Используя PHP в качестве препроцессора — да.
CEHT9I6PbCKuu_nemyx 10.09.2021 22:28 # 0
guest6 10.09.2021 22:17 # 0
Хотя проблема конечно несколько надуманная, я согласен.
Можно ли подключить автоматически все .hpp файлы в папке??
bormand 10.09.2021 22:41 # +1
bormand 10.09.2021 22:47 # +1
guest6 10.09.2021 22:47 # 0
bormand 10.09.2021 22:50 # 0
guest6 10.09.2021 22:56 # 0
find вообще мощная питушня очень
bormand 10.09.2021 22:57 # 0
Правда я вообще не помню его опции, обычно просто высираю список файлов и другими тулами обрабатываю (i.e. find | grep). Поэтому -printf сразу в голову не пришёл.
guest6 10.09.2021 22:59 # 0
Он умеет несколько условий по OR или AND объединять например
bormand 10.09.2021 22:53 # +1
CHayT 10.09.2021 22:17 # 0
guest6 10.09.2021 22:50 # 0
CEHT9I6PbCKuu_nemyx 10.09.2021 17:24 # 0
https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html
ISO 10.09.2021 22:07 # 0
https://gcc.godbolt.org/z/hv33eT7jd
Единственная проблема — прокинуть в публичный интерфейс размер и выравнивание приватного питуха. А так — полный зирокост.
guest6 10.09.2021 22:14 # 0
а не придеца потом пересобирать всё когда размер внутреннего питуха изменица?
ISO 10.09.2021 22:16 # 0
Собственно, если ты не используешь такой «pimpl» и изменяешь публичный класс — тебе всё равно придётся всё пересобирать.
guest6 10.09.2021 22:18 # 0
Впрочем, API не сломается, так что выпускать новый .h не придется
Но клиента нужно будет перебрать
или нет?
ISO 10.09.2021 22:20 # +1
API тоже сломается: размер публичного-то петуха тоже изменится.
guest6 10.09.2021 22:51 # 0
ISO 10.09.2021 23:10 # +1
Тогда хуярь всё в .hpp.
ISO 10.09.2021 23:14 # +3
guest6 10.09.2021 23:26 # 0
> std::aligned_storage_t
> new (&impl)
> alignof
> void*
> noexcept
Выебнулся, молодец. В моём коде такой хуйни нет.
guest6 10.09.2021 23:29 # +2
Без плейсмент нью ты никак не
ISO 10.09.2021 23:32 # +1
1505407
CEHT9I6PbCKuu_nemyx 10.09.2021 23:46 # +2
Desktop 10.09.2021 23:48 # 0
guest6 10.09.2021 23:32 # 0
ISO 10.09.2021 23:34 # 0
guest6 10.09.2021 23:39 # 0
https://govnokod.xyz/_27655/#comment-658861
Здеся не объявлять kok() в h-нике.
Можно сделать pimpl как с указателем, так и без него. Тогда приватные методы не нужно описывать в .h. Но исходную проблему (количество кода) это не решает.
ISO 10.09.2021 23:43 # 0
«private_kukareku()» — это и есть твой «kok».
> количество кода
Если твоя проблема именно в количестве кода — то тебе действительно нужно описывать весь класс в .hpp. Меньше ты в любом случае никак не сделаешь.
3_dar 10.09.2021 23:46 # +1
Я меняю сигнатуру приватного метода и мне нужно подправить это в двух местах, когда этого можно было избежать.
ISO 10.09.2021 23:51 # 0
Потому что компилятор должен иметь возможность скомпилировать твой класс исключительно по его объявлению. Грубо говоря, .h-файл — это не только API, а ещё и ABI. Без объявления приватных членов ABI объявить невозможно без грязных хаков.
CEHT9I6PbCKuu_nemyx 10.09.2021 23:54 # 0
ISO 10.09.2021 23:58 # 0
В том числе, да.
> А если вместо приватных методов и полей в хедере написать foo, bar, baz, чтобы секреты не раскрывать?
Какая обфусцированная «Java» )))
guest6 11.09.2021 01:10 # 0
3_dar 10.09.2021 23:50 # 0
?
ISO 10.09.2021 23:52 # +1
P.S. А ещё у меня там тупая утечка — помнил о ней, но забыл поправить перед постингом. Какой багор )))
3_dar 10.09.2021 23:54 # 0
ISO 10.09.2021 23:57 # 0
Для твоей задачи он, возможно, и лучше.
3_dar 10.09.2021 23:59 # 0
Чем мой пример не подходит?
ISO 11.09.2021 00:01 # 0
3_dar 11.09.2021 00:10 # 0
И тут мы опять приходим к вопросу - писать в одном impl.hpp, или разносить в .cpp. Тогда нахуй оно надо?
3_dar 11.09.2021 00:12 # 0
ISO 11.09.2021 00:15 # 0
* Против «IDA Pro» нет приёма.
3_dar 11.09.2021 00:19 # +1
А ты указал, что у тебя тут будет некое говно вручную предпосчитанного размера (без инклуда).
ISO 11.09.2021 00:23 # 0
3_dar 11.09.2021 00:24 # 0
guest6 11.09.2021 00:39 # 0
ISO 11.09.2021 00:43 # 0
guest6 11.09.2021 00:46 # +1
CEHT9I6PbCKuu_nemyx 11.09.2021 00:23 # 0
Прыжок в середину инструкции.
** Такой прыжок невозможен в RISC-процессорах и в процессорах, требующих выравнивания адреса перехода.
bormand 11.09.2021 00:31 # +3
*** Но у некоторых RISC-процессоров, таких как "ARM" с набором инструкций "thumb-2" таки возможен. Правда х.з. получится ли там что-то разумное и полезное.
CEHT9I6PbCKuu_nemyx 11.09.2021 00:39 # +1
3.14159265 11.09.2021 04:04 # +2
Два реальных примера коллизий.
3.14159265 11.09.2021 03:48 # +1
И у MIPS16, и даже у тех, который имеют слово RISC прямо в названии.
Реальный пример:
j123123 11.09.2021 03:52 # +2
https://govnokod.ru/20245#comment335899
я об этом писал.
CEHT9I6PbCKuu_nemyx 11.09.2021 00:36 # 0
«IDA Pro» дизассемблирует только одну из веток: либо исходную функцию с mov, либо сгенерированный нами опкод.
bormand 11.09.2021 00:45 # +1
Но у неё в названии не просто так есть буква "I". Так что в отличие от автоматических дизасмов ты всегда можешь переключиться между этими ветками.
j123123 11.09.2021 04:07 # 0
Это проблема «IDA Pro». Дизассемблировать можно по всем возможным смещениям, и визуализировать это как-то так https://i.imgur.com/LvuS6Zt.png
guest6 11.09.2021 00:50 # 0
3_dar 11.09.2021 01:03 # +1
guest6 11.09.2021 01:04 # +1
CEHT9I6PbCKuu_nemyx 10.09.2021 23:39 # 0
guest6 10.09.2021 22:34 # 0
rotoeb 10.09.2021 23:08 # +2
CEHT9I6PbCKuu_nemyx 10.09.2021 23:29 # +1
mittorn 22.09.2021 15:04 # 0