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