[ d ] [ b / cu / dev ] [ r ] [ a / ts ] [ ci ] [ gnx / int ] [ misc ] [ dev / stat ]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог] [Главная]

Файл: 1370604094402 _pr_ cplusplus in 7 days.png -(152 KB, 744x638, 1370604094402 _pr_ cplusplus in 7 days.png)
152 No.12637  
Нагуглить не смог.

Можно ли сделать friend function, но friend не по отношению к классу, а к другой функции?

пощу баян
>> No.12639  
Файл: lain_2_by_suzumiya_haru_hi-d375gfi.png -(110 KB, 586x293, lain_2_by_suzumiya_haru_hi-d375gfi.png)
110
>>12637

С++ этого напрямую сделать не позволяет, но возможны различные workaround'ы.

Например, можно объявить в классе метод как protected, унаследовать от этого класса другой и объявить нужную функцию дружественной уже к унаследованному классу.

Кроме того есть интересный passkey-паттерн:
http://stackoverflow.com/questions/3220009/is-this-key-oriented-access-protection-pattern-a-known-idiom
>> No.12640  
friend предоставляет функциям доступ к private и protected членам класса. Для использования не рекомендуется.
Теперь объясни чего ты хочешь получить в одной функции от другой (коме как вызвать).
>> No.12642  
>>12640

Видимо он хочет доступа ко внутренним переменным. И да, это естественно глупость а ОП бака
>> No.12644  
Ох уж эти иксперты-кукаретики.
Простейший пример: операторы сериализации. Скажем, надо сериализовать объект в массив char или что-то подобное. Тут то нам и пригодится доступ из оператора к private-членам сериализуемого класса, т.к. состояние объекта не обязательно полностью доступно извне. (Хинт: оператор - та же функция.)
А в крестах это делается элементарно. В Qt это выглядит как-то так:
friend QDataStream &operator<< (QDataStream &s, const YourClass &yourObject);
>> No.12645  
>>12644
В этом случае я обычно делаю public метод
QDataStream& YourClass::saveToStream(QDataStream &stream) const;
и оператор сериализации
inline QDataStream& operator<<(QDataStream& stream, const YourClass& obj) {return obj.saveToStream(stream);}
В самом операторе постоянно разыменовывать объект для доступа к членам муторно и не правильно.
>> No.12647  
>>12645
Скажи это авторам Qt.
Не могу сказать, что совсем с тобой не согласен, но, на мой взгляд, в том, чтобы плодить лишние методы, тоже есть свои минусы. Разыменование же вообще не проблема, не обязательно имя параметра делать многобуквенным, обозначил как const YourClass &o и все.
>> No.12648  
Файл: 1417446186273.png -(121 KB, 283x269, 1417446186273.png)
121
>Можно ли сделать friend function, но friend не по отношению к классу, а к другой функции?

Пожалуй сохраню это в свою коллекцию идиотизмов. Нет, ну правда, о чем думал оп когда создавал нить? Подумал ли он о том что хочет получить доступ к тому, чего либо еще нет (фунция не вызвана), либо уже нет (функция отработала и удалила свой стекфрэйм вместе со всеми локальными переменными)?
>> No.12649  
>>12648
Нет, это твой пост надо сохранить.
>> No.12650  
>>12649

Это почему? Или ты из тех кто мелет языком, не отвечая за сказанное?
>> No.12652  
>>12650
Потому что хуйню ты полную спизданул. Объявление класса/функции как дружественного означает, что этот класс/функция получают доступ к protected/private членам класса, по отношению к которому они были объявлены дружественными. При чем тут вообще стек, существование чего-то или не-существование? Не к экземпляру класса же идет привязка, а к самому классу. Где у тебя тут несуществующее и удаленное из стека? http://ideone.com/3tBZvo Хоть бы разобрались сначала, прежде чем кукарекать.
>> No.12655  
Как я вспонмил теперь, у GCC в режиме C есть nested functions.

Я только что понял, что я решеине узнал ещё вчера - function object. Класс, у которого есть оператор (). Все переменные определяю в нём, и френдом делаю класс, а не функцию.


>>12640
>Теперь объясни чего ты хочешь получить в одной функции от другой (коме как вызвать).

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


>>12645
>В самом операторе постоянно разыменовывать объект для доступа к членам муторно и не правильно.

О, кстати, а результаты выполнения каких операторов кэшируются? Разыменование кэшируется?


>>12650

1) Потому что статиков нафигачу и всё у меня будет.
2) Потому что мфв из анимы.

>>12652
>При чем тут вообще стек, существование чего-то или не-существование?
>>Можно ли сделать friend function, но friend не по отношению к классу, а к другой функции?

А вот при том.
>> No.12656  
>>12655
>Я хочу вынести куски кода в функцию для улучшения организации

Для улучшения читаемости, то есть.
>> No.12657  
>>12655
>А вот при том.
Прости, я жопой читал. Мои извинения.
>> No.12660  
>>12652

Хотел было в эпитетах написать насколько ты долбишься в глаза, но >>12655-кун ткнул в нужное первым. Да и вообще, высмеивать убогих - зло.
>> No.12661  
>>12660
А выебываться, когда уже извинились, и того хуже.
>> No.12662  
>>12655

>1) Потому что статиков нафигачу и всё у меня будет.

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

>2) Потому что мфв из анимы.

Кто? Откуда?
>> No.12664  
>>12661

>выебываться

Этим тут занимался только ты.
>> No.12670  
>>12662
>Ты конечно прав с этим. Но, как по мне, статики в функции являются исключением нежели правилом.

Всё лучше, чем ты думаешь - я объявлю все переменные в function object, которому я делаю друзей. И никаких статиков не будет, это я пошутил так.


>>12664
>Этим тут занимался только ты.

Голос из-за соседнего столика: "Нет. >>12660 этим тоже занимался, да и >>12648 тоже."
>> No.12671  
Файл: NO_U.jpg -(39 KB, 521x332, NO_U.jpg)
39
>>12664
>> No.12673  
>>12670

А не путаешь ли ты провокационную манеру донесения знаний с выебонами? И почему интересно я не должен был называть убогого агрессивного невежду убогим?
>> No.12674  
Девочки, не ссорьтесь.
>> No.12675  
>>12673
>И почему интересно я не должен был называть убогого агрессивного невежду убогим?

Потому что ты никому ничего не должен, например.

Давай, я лучше поверну вопрос другой стороной: твой пост хоть какую-нибудь ценность имеет? Он хотя бы крупинку юмора содержит?

>провокационную манеру донесения знаний

Кривое формулирование своих мыслей, не преследующее никакую цель, кроме соответствия негласным стандартам вербальной борьбы "кто из нас лох", сегодня именно так назвается? Я запишу.

Конкретно мне такое самовыражение претит.
>> No.12676  
Файл: 1367769827631.gif -(153 KB, 247x318, 1367769827631.gif)
153
>>12675

>твой пост хоть какую-нибудь ценность имеет?

Давай перечитаем часть моего первого пост вместе. Если хочешь, можно даже по слогам.

> Подумал ли он о том что хочет получить доступ к тому, чего либо еще нет (фунция не вызвана), либо уже нет (функция отработала и удалила свой стекфрэйм вместе со всеми локальными переменными)?

В этом месте я ссылаюсь на явно неправильную постановку вопроса в ОП-посте( friend-овость не к классу, к функции) и уточняю почему именно: данные, которые можно получить "по дружбе" из функции, по факту с большой вероятностью банально не определены.

Нет, есть конечно вариант что где-то выше по стеку вызовов уже начала работать(и соответственно еще не завершилась) нужная нам функция... но надежда на такого рода совпадения является маргинальщиной порядками большей нежели использование в функции кучи статиков.

Также есть отсылка на конкретный термин - stackframe - зацепившись за который можно найти нужную информацию о процессе вызова функций. В частности о том, где и как обычно размещаются переменные, определенные в функции.

Каюсь: мне почему-то показалось что недвусмысленного намека с отсылкой в нужном направлении хватит. В крайнем случае я был готов ответить на возникшие вопросы и уточнить неправильно понятое. Но откровенное хамство, добротно перемешанное с нежеланием нормально прочитать написанное, была для меня неожиданностью я почему-то был лучшего мнения о здешних обитателях. Но видимо они появляются тут намного реже случайных посетителей учебных заведений
>> No.12677  
>>12676
>Но откровенное хамство, добротно перемешанное с нежеланием нормально прочитать написанное, была для меня неожиданностью я почему-то был лучшего мнения о здешних обитателях. Но видимо они появляются тут намного реже случайных посетителей учебных заведений
http://www.youtube.com/watch?v=lkvDPXULSy0
>> No.12678  
>>12677

Вот не зря я на провокацию пошел. Не зря! Всего лишь, казалось бы, назвал сказанное человеком идиотизмом. Сказанное, не самого человека. И тут такое понеслось.

Мне в связи с этим просто до жути интересно: а какого это самоассоциировать себя с любой когда либо сказанной тобой фразой даже на анонимной борде? Может у тебя какие комплексы? Ты не скрывай - мы поможем.
>> No.12679  
>>12678
Кончай бомбить уже.
>> No.12680  
>>12679

Бомбишь тут только ты. но ведь все равно же будешь тужиться, доказывая что нет
>> No.12681  
А могли бы код писать.
>> No.12682  
>>12680
На мое слово десять твоих. Делай выводы.
>> No.12683  
Заканчивайте.
>> No.12685  
ОП здесь. Даже отвечать не хочу на всё это. Два тупака сошлись, хотят доказать друг другу, что один тупее, а в итоге - доказали, что тупые оба.

Пока вы вакуум перемещали, я додумался до ещё более простого - сделать класс, в нём определить все переменные, и вызывать метод класса, а дальше методы одного класса могут вызывать друг друга и ничего не передавать друг другу и использовать одни переменные.

>>12676
>В этом месте я ссылаюсь на явно неправильную постановку вопроса в ОП-посте( friend-овость не к классу, к функции) и уточняю почему именно: данные, которые можно получить "по дружбе" из функции, по факту с большой вероятностью банально не определены.

Мне глубоко фиолетово, что будет, если поделить на ноль сделать френд для функции с нестатическими переменными. Мне нужно дать одно окружение двум функциям.
>> No.12695  
>>12685

>ОП здесь.

А ты никуда и не уходил. Завязывай сайемперсунить чтоли. ну не верю я в то что у такого олуха есть почитатели/воздыхатели, способные вот так вот впрячься за какую-то ничего не значащую для других фигню
>> No.12699  
>>12695
>ну не верю я в то что у такого олуха есть почитатели/воздыхатели, способные вот так вот впрячься за какую-то ничего не значащую для других фигню

Я считаю, что я достаточно прямо выразил свою точку зрения. Сошлись два идиота, один из которых прочитал ОП-пост лучше.

Ты не веришь в то, что того, кто обзывается, тоже могут обозвать?

Мои посты:>>12637>>12655>>12656>>12670>>12675>>12685>>12699
>> No.12700  
>>12699

Я не верю в то что кто-то взялся отстаивать позицию, которая имеет значение только для выразившего ее.
>> No.12702  
>>12700

Ссыку на отстаивание мной чье-то позиции в студию. Что-то я не помню такого.

Если ты не заметил, >>12673 отвечает мне и ему отвечаю тоже я.
>> No.12704  
>>12685

>Мне глубоко фиолетово, что будет, если поделить на ноль сделать френд для функции с нестатическими переменными.

какие все умные задним числом. Но спросил то ты именно об этом. А если бы подумал сразу - не спрашивал бы.

>Мне нужно дать одно окружение двум функциям.

Извини за мой французский, но если тебе изначально надо было именно это, то ты либо тролль, либо дурак.
>> No.12707  
>>12704
>какие все умные задним числом. Но спросил то ты именно об этом. А если бы подумал сразу - не спрашивал бы.

Заднее число? Ну ты и лолка.

Давай по-другому. Представь себе, что я спросил не "как сделать френд для функции", а "как сделать френд для класса". И тут ты, такой, говоришь, что класс может быть ещё не создан или уже уничтожен. Вот это новость, прикинь, класс может быть ещё не создан! А уж если он уничтожен, то ваще пипец!


>Извини за мой французский, но если тебе изначально надо было именно это, то ты либо тролль, либо дурак.

Хоть горшком назови.
>> No.12709  
>>12707

Ты правда дурак или прикидываешься?
Предположим я закрою глаза на то что friend'ить функцией класс - это впринципе единственная возможность что-то заfriend'ить. Вполне себе доходчиво описанная в книгах и статьях. Но

>класс не создан

Почему ты месишь в одну кучу экземпляр класса и сам класс?
>> No.12710  
>>12709

Вот, смотри, ты начинаешь догонять до того, что реплика о ещё не созданных или уже истреблённых переменных была не совсем умной.
>> No.12711  
>>12710

Умность - понятие субъективное. Я же говорил о конкретном факте. Если хочешь доказать мне ложность моего изначального утверждения про stackframe и существование переменных, размещаемых в нем - то вперед. До тех пор я буду называть кошку кошкой, а идиотизм - идиотизмом.

Пишу я на самом деле потому что мне интересно, насколько агрессивные и упорные нынче пошли невежды.
>> No.12712  
>>12711

Есть какая-то причина для того, чотбы называть меня невеждой?

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

>До тех пор я буду называть кошку кошкой, а идиотизм - идиотизмом.

Чья-то (твоя? Не знаю) реплика о ещё не созданных или уже истреблённых переменных и есть идиотизм, давай с этого начнём. А если точнее - формализм в отношении чего-то не имеющего никакой формальности.

У GCC есть локальные функции - офигеть, как же быть, если переменные ещё не созданы, а локальная функция уже вызвана. А она, представь себе, не может быть вызвана, если не был вызван предок. Оказывается, никакой дилеммы нет?

Функция, представь себе, может выполняться не в одном потоке, то есть её окружений может быть несколько. Вот тебе и экземпляры.
>> No.12716  
>>12712

>У GCC есть локальные функции

Это ты так nested functions обозвал? И тебя не смущает то что они видны исключительно внутри функции, в которой определены?
>> No.12717  
>>12716

Мне большее и не нужно. Я же писал выше: хочу выделять куски алгоритма в блоки так, чтобы это было читаемо.

К примеру:

сесть_в_автобус()
{
подойти_к_двери();
запрыгнуть_на_ступеньку(); //инбифо низкопольные автобусы
оплатить_проезд();
}


И где-нибудь в конце функции сесть-в_автобус - все определения.

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


Альтернатива - использовать goto и поддерживать правильные метки.
>> No.12719  
>>12717
сесть_в_автобус()
{
{ //подойти_к_двери

}

{ //запрыгнуть_на_ступеньку инбифо низкопольные автобусы

}

{ //оплатить_проезд

}
}
>> No.12720  
>>12719

Это немного не то. Мне нужно перенести код, содержащий трудночитаемые операции, в другое место.

Конечно, я могу запихнуть его в блоки, но их нужно сворачивать. Я не слышал о том, что можно сделать чтобы IDE сворачивала код сама, опираясь на какие-то указания.
>> No.12721  
>>12720
> сделать так, чтобы IDE сворачивала код сама
>> No.12722  
>>12720

Но почему ты продолжаешь спрашивать свой вопрос в то время когда сам дал на него же ответ? Или ты вдруг не знаешь что методы класса можно реализовать не только при описании самого класса?
>> No.12723  
>>12722
>Но почему ты продолжаешь спрашивать свой вопрос

где
>> No.12724  
>>12723


Вот тут:

>я додумался до ещё более простого - сделать класс, в нём определить все переменные, и вызывать метод класса, а дальше методы одного класса могут вызывать друг друга и ничего не передавать друг другу и использовать одни переменные.

Или ты будешь говорить что >>12685 это не ты?
>> No.12725  
>>12724

>Но почему ты продолжаешь спрашивать свой вопрос
>>где
>Вот тут:

Это ответ, а не вопрос. Где ты видишь повторение вопроса ниже по тексту?

наркоман штоле :3
>> No.12727  
>>12725

Наркоман здесь только ты. Но я упорный, поэтому продолжу тыкать тебя носом в твой же бред:

>>12720
>Мне нужно перенести код, содержащий трудночитаемые операции, в другое место.

>>12717
>Мне большее и не нужно. Я же писал выше: хочу выделять куски алгоритма в блоки так, чтобы это было читаемо.

Это вопросы, ответом на которые служит тобою же написанное ранее

>я додумался до ещё более простого - сделать класс, в нём определить все переменные, и вызывать метод класса, а дальше методы одного класса могут вызывать друг друга и ничего не передавать друг другу и использовать одни переменные.
>> No.12731  
>>12727
>Это вопросы

Подзравляю, ты наркоман. Это не вопросы.
>> No.12732  
Задрали вы уже друг перед другом выделываться! Всё равно же в Ад едем!
>> No.12733  
>>12731

Тогда удаляй нить раз это не вопросы. Зачем ты изливаешь сюда поток сознания если не хочешь читать то что тебе о нем говорят? Уютный бложик можно завести на других ресурсах.
>> No.12734  
>>12733
shut up bitch
>> No.12735  
>>12733
>Зачем ты изливаешь сюда поток сознания если не хочешь читать то что тебе о нем говорят?

Если не хочу - изливать не буду. А ты подумал, что я не хочу?

>>12732

"Можно ехать и ЕХАТЬ." - говорит Daniel в русском переводе Taxi.
>> No.12738  
Файл: poehat.png -(76 KB, 567x284, poehat.png)
76
>>12735
>> No.12739  
Пользуясь случаем, хочу спросить.
Реализация класса в hpp-файле допустима?
А то у меня ошибки "multiple definition of" при линковке старого проекта. Видимо, надо все классы разделять на h и cpp. Или не надо? C++-нуб со стажем 10+ лет
>> No.12741  
>>12739

Инклуд - это буквальная вставка файла. Если такая вставка приводит к конфликтам, то ты делаешь что-то неверно.
>> No.12751  
>>12739
Header может подключаться несколько раз для одной единицы компиляции (cpp-файла). Стоит завернуть его содержимое в ifndef:

#ifndef some_unique_header_name
#define some_unique_header_name
// содержимое .h/.hpp-файла
#endif
в конкретных реализациях могут быть специальные прагмы для этого, но они в общем случае непортируемы
>> No.12752  
>>12751
Да не, ифдефы были. Спасибо, я разобрался.
Просто все cpp-файлы ведь собираются по-отдельности. И один из классов, который я реализовывал прямо в hpp-файле был включен в два разных cpp, которые, естественно, не могли слинковаться. Так что я просто разделил этот hpp на hpp+cpp. И планирую проделать это в дальнейшем с остальными классами.
>> No.12804  
Вопрос.

Как можно интегрировать/инлайнить std/stl во время компиляции? Вот sort для массива целых чисел, например, будет вызывать функцию для каждого сравнения. Или не будет? Я не знаю, как она реализована, но я хотел бы, чтобы функция сравнения была заинлайнена.

Или я чего-то не понимаю, и на самом деле компилятор делает всё по-умному?
>> No.12806  
>>12804
Функция сравнения обычно будет "заинлайнена", если её тело находится в той же единице компиляции, что и вызов (то есть, если код её тела находится в том же файле или в подключенном заголовочном файле), и включена оптимизация. Если код функции сравнения находится в другом *.cpp файле, то обычно (когда не применяется link-time optimization) компилятор его просто не видит в тот момент, когда можно "инлайнить".
>> No.12808  
>>12806

Что такое инлайн и его основные принципы я знаю. Меня интересует интеграция STDlib/STL в код.
>> No.12810  
>>12806

И, в частности, мне интересно, будут ли вызовы компаратора эффективными.

Или будут ли вызовы стандартных методов эффективными/заинлайнеными, или это будут те же call/jmp.
>> No.12811  
>>12810
> будут ли вызовы стандартных методов эффективными/заинлайнеными
Каких стандартных? std::less<T> и прочих? Да, будут, они же в header'ах определены. Возьми g++ -O -S -masm=intel и посмотри.
>> No.12814  
>>12811
>Каких стандартных?

Ну, не только less<T>. Будут инлайниться только те, которые определены в заголовках? Тогда я сам айду.

Ты не читаешь другие части моих постов. Есть процедура sort, она принимает указатель на компаратор. Вопрос: компаратор будет заинлайнен внутри sort, или это невозможно?
>> No.12819  
>>12814
> Есть процедура sort, она принимает указатель на компаратор. Вопрос: компаратор будет заинлайнен внутри sort, или это невозможно?
О какой процедуре sort ты говоришь? Если об std::sort, то она шаблонная, поэтому она определяется в заголовочном файле, то есть инлайнингу ничто не препятствует. Если это какая-то другая sort и тело этой sort с телом компаратора после обработки препроцесcором не оказываются в одной единице трансляции, то в этом случае инлайнинга не будет.
>> No.12820  
>>12819
>Если об std::sort, то она шаблонная, поэтому она определяется в заголовочном файле, то есть инлайнингу ничто не препятствует.

Как оказалось - таки препятствует. Ккомпаратор будет заинлайнен внутри sort только в том случае, если я передаю функтор.

Правильно?
>> No.12821  
>>12820
> Ккомпаратор будет заинлайнен внутри sort только в том случае, если я передаю функтор.
А как передать в std::sort не функтор? Если ты имеешь в виду просто вызов std::sort с двумя итераторами, то ясно, что если operator< для объектов того типа, на который указывает итератор, определён не в заголовочном файле (или он виртуальный), то его не заинлайнить.
>> No.12822  
>>12821
>template <class RandomAccessIterator, class Compare>
>void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

>comp
>Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines.
>The function shall not modify any of its arguments.

>А как передать в std::sort не функтор?

>This can either be a function pointer or a function object.

>Если ты имеешь в виду просто вызов std::sort с двумя итераторами,

Да нет же, я передаю компаратор, писал же.

>то ясно, что если operator< для объектов того типа, на который указывает итератор, определён не в заголовочном файле (или он виртуальный), то его не заинлайнить.

Не понял. Придумал я свой класс, определил в них операторы сравнения, использую sort с двумя итераторами (компаратор по-умолчанию) - что же, метод сравнения не будет заинлайнен?

http://stackoverflow.com/questions/328955
http://stackoverflow.com/questions/356950

Пишут, что если передавать функтор, всё всем инлайнится. Или я чего-то не понимаю?
>> No.12824  
>>12820
> Как оказалось - таки препятствует.
Если компилятору во время компиляции известно, куда именно указывает указатель на функцию, то теоретически он может заинлайнить её. В случае GCC помогает объявление __attribute__((flatten)) для функции, из которой происходит вызов std::sort.
>>12822
> Придумал я свой класс, определил в них операторы сравнения, использую sort с двумя итераторами (компаратор по-умолчанию) - что же, метод сравнения не будет заинлайнен?
Нужно тело оператора сравнения определять в header'е, тогда всё будет хорошо.
>> No.12826  
>>12824

О, хорошо сказал.

То есть, чтобы всьо инлайнилось, надо:

1) использовать только те функции, реализация которых есть в боилерплейте, внутри которого мне нужны инлайны;
2) передавать функторы вместо указателей;
3) или писать "flatten".


Олсо: что есть link time optimization?
>> No.12827  
>>12826
Link time optimization - прямо таки то, что значит название - оптимизация во время линковки obj-файлов между собой. Один obj-файл - один cpp-файл. Соответственно, что-то такое более мощное, чем оптимизация каждого по-отдельности. Вроде бы lte должно уменьшать размер бинарника.
мимо-проходил-кун
>> No.12829  
>>11826
Передавать функторы в этом плане надёжней, нежели полагаться на специфичные для компилятора расширения или опции вроде -findirect-inlining.



[ d ] [ b / cu / dev ] [ r ] [ a / ts ] [ ci ] [ gnx / int ] [ misc ] [ dev / stat ]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог] [Главная]