Нагуглить не смог. Можно ли сделать friend function, но friend не по отношению к классу, а к другой функции? пощу баян
>>12637 С++ этого напрямую сделать не позволяет, но возможны различные workaround'ы. Например, можно объявить в классе метод как protected, унаследовать от этого класса другой и объявить нужную функцию дружественной уже к унаследованному классу. Кроме того есть интересный passkey-паттерн: http://stackoverflow.com/questions/3220009/is-this-key-oriented-access-protection-pattern-a-known-idiom
friend предоставляет функциям доступ к private и protected членам класса. Для использования не рекомендуется. Теперь объясни чего ты хочешь получить в одной функции от другой (коме как вызвать).
>>12640 Видимо он хочет доступа ко внутренним переменным. И да, это естественно глупость а ОП бака
Ох уж эти иксперты-кукаретики. Простейший пример: операторы сериализации. Скажем, надо сериализовать объект в массив char или что-то подобное. Тут то нам и пригодится доступ из оператора к private-членам сериализуемого класса, т.к. состояние объекта не обязательно полностью доступно извне. (Хинт: оператор - та же функция.) А в крестах это делается элементарно. В Qt это выглядит как-то так: friend QDataStream &operator<< (QDataStream &s, const YourClass &yourObject);
>>12644 В этом случае я обычно делаю public метод QDataStream& YourClass::saveToStream(QDataStream &stream) const; и оператор сериализации inline QDataStream& operator<<(QDataStream& stream, const YourClass& obj) {return obj.saveToStream(stream);} В самом операторе постоянно разыменовывать объект для доступа к членам муторно и не правильно.
>>12645 Скажи это авторам Qt. Не могу сказать, что совсем с тобой не согласен, но, на мой взгляд, в том, чтобы плодить лишние методы, тоже есть свои минусы. Разыменование же вообще не проблема, не обязательно имя параметра делать многобуквенным, обозначил как const YourClass &o и все.
>Можно ли сделать friend function, но friend не по отношению к классу, а к другой функции? Пожалуй сохраню это в свою коллекцию идиотизмов. Нет, ну правда, о чем думал оп когда создавал нить? Подумал ли он о том что хочет получить доступ к тому, чего либо еще нет (фунция не вызвана), либо уже нет (функция отработала и удалила свой стекфрэйм вместе со всеми локальными переменными)?
>>12648 Нет, это твой пост надо сохранить.
>>12649 Это почему? Или ты из тех кто мелет языком, не отвечая за сказанное?
>>12650 Потому что хуйню ты полную спизданул. Объявление класса/функции как дружественного означает, что этот класс/функция получают доступ к protected/private членам класса, по отношению к которому они были объявлены дружественными. При чем тут вообще стек, существование чего-то или не-существование? Не к экземпляру класса же идет привязка, а к самому классу. Где у тебя тут несуществующее и удаленное из стека? http://ideone.com/3tBZvo Хоть бы разобрались сначала, прежде чем кукарекать.
Как я вспонмил теперь, у GCC в режиме C есть nested functions. Я только что понял, что я решеине узнал ещё вчера - function object. Класс, у которого есть оператор (). Все переменные определяю в нём, и френдом делаю класс, а не функцию. >>12640 >Теперь объясни чего ты хочешь получить в одной функции от другой (коме как вызвать). Только этого и хочу. Я хочу вынести куски кода в функцию для улучшения организации, но не хочу передавать туда кучу параметров. >>12645 >В самом операторе постоянно разыменовывать объект для доступа к членам муторно и не правильно. О, кстати, а результаты выполнения каких операторов кэшируются? Разыменование кэшируется? >>12650 1) Потому что статиков нафигачу и всё у меня будет. 2) Потому что мфв из анимы. >>12652 >При чем тут вообще стек, существование чего-то или не-существование? >>Можно ли сделать friend function, но friend не по отношению к классу, а к другой функции? А вот при том.
>>12655 >Я хочу вынести куски кода в функцию для улучшения организации Для улучшения читаемости, то есть.
>>12655 >А вот при том. Прости, я жопой читал. Мои извинения.
>>12652 Хотел было в эпитетах написать насколько ты долбишься в глаза, но >>12655-кун ткнул в нужное первым. Да и вообще, высмеивать убогих - зло.
>>12660 А выебываться, когда уже извинились, и того хуже.
>>12655 >1) Потому что статиков нафигачу и всё у меня будет. Так нафигач их вне функции, будь как все начинающие. Ты конечно прав с этим. Но, как по мне, статики в функции являются исключением нежели правилом. А значит их наличие должно обговариваться отдельно >2) Потому что мфв из анимы. Кто? Откуда?
>>12661 >выебываться Этим тут занимался только ты.
>>12662 >Ты конечно прав с этим. Но, как по мне, статики в функции являются исключением нежели правилом. Всё лучше, чем ты думаешь - я объявлю все переменные в function object, которому я делаю друзей. И никаких статиков не будет, это я пошутил так. >>12664 >Этим тут занимался только ты. Голос из-за соседнего столика: "Нет. >>12660 этим тоже занимался, да и >>12648 тоже."
>>12664
>>12670 А не путаешь ли ты провокационную манеру донесения знаний с выебонами? И почему интересно я не должен был называть убогого агрессивного невежду убогим?
Девочки, не ссорьтесь.
>>12673 >И почему интересно я не должен был называть убогого агрессивного невежду убогим? Потому что ты никому ничего не должен, например. Давай, я лучше поверну вопрос другой стороной: твой пост хоть какую-нибудь ценность имеет? Он хотя бы крупинку юмора содержит? >провокационную манеру донесения знаний Кривое формулирование своих мыслей, не преследующее никакую цель, кроме соответствия негласным стандартам вербальной борьбы "кто из нас лох", сегодня именно так назвается? Я запишу. Конкретно мне такое самовыражение претит.
>>12675 >твой пост хоть какую-нибудь ценность имеет? Давай перечитаем часть моего первого пост вместе. Если хочешь, можно даже по слогам. > Подумал ли он о том что хочет получить доступ к тому, чего либо еще нет (фунция не вызвана), либо уже нет (функция отработала и удалила свой стекфрэйм вместе со всеми локальными переменными)? В этом месте я ссылаюсь на явно неправильную постановку вопроса в ОП-посте( friend-овость не к классу, к функции) и уточняю почему именно: данные, которые можно получить "по дружбе" из функции, по факту с большой вероятностью банально не определены. Нет, есть конечно вариант что где-то выше по стеку вызовов уже начала работать(и соответственно еще не завершилась) нужная нам функция... но надежда на такого рода совпадения является маргинальщиной порядками большей нежели использование в функции кучи статиков. Также есть отсылка на конкретный термин - stackframe - зацепившись за который можно найти нужную информацию о процессе вызова функций. В частности о том, где и как обычно размещаются переменные, определенные в функции. Каюсь: мне почему-то показалось что недвусмысленного намека с отсылкой в нужном направлении хватит. В крайнем случае я был готов ответить на возникшие вопросы и уточнить неправильно понятое. Но откровенное хамство, добротно перемешанное с нежеланием нормально прочитать написанное, была для меня неожиданностью я почему-то был лучшего мнения о здешних обитателях. Но видимо они появляются тут намного реже случайных посетителей учебных заведений
>>12676 >Но откровенное хамство, добротно перемешанное с нежеланием нормально прочитать написанное, была для меня неожиданностью я почему-то был лучшего мнения о здешних обитателях. Но видимо они появляются тут намного реже случайных посетителей учебных заведений http://www.youtube.com/watch?v=lkvDPXULSy0
>>12677 Вот не зря я на провокацию пошел. Не зря! Всего лишь, казалось бы, назвал сказанное человеком идиотизмом. Сказанное, не самого человека. И тут такое понеслось. Мне в связи с этим просто до жути интересно: а какого это самоассоциировать себя с любой когда либо сказанной тобой фразой даже на анонимной борде? Может у тебя какие комплексы? Ты не скрывай - мы поможем.
>>12678 Кончай бомбить уже.
>>12679 Бомбишь тут только ты. но ведь все равно же будешь тужиться, доказывая что нет
А могли бы код писать.
>>12680 На мое слово десять твоих. Делай выводы.
Заканчивайте.
ОП здесь. Даже отвечать не хочу на всё это. Два тупака сошлись, хотят доказать друг другу, что один тупее, а в итоге - доказали, что тупые оба. Пока вы вакуум перемещали, я додумался до ещё более простого - сделать класс, в нём определить все переменные, и вызывать метод класса, а дальше методы одного класса могут вызывать друг друга и ничего не передавать друг другу и использовать одни переменные. >>12676 >В этом месте я ссылаюсь на явно неправильную постановку вопроса в ОП-посте( friend-овость не к классу, к функции) и уточняю почему именно: данные, которые можно получить "по дружбе" из функции, по факту с большой вероятностью банально не определены. Мне глубоко фиолетово, что будет, если поделить на ноль сделать френд для функции с нестатическими переменными. Мне нужно дать одно окружение двум функциям.
>>12685 >ОП здесь. А ты никуда и не уходил. Завязывай сайемперсунить чтоли. ну не верю я в то что у такого олуха есть почитатели/воздыхатели, способные вот так вот впрячься за какую-то ничего не значащую для других фигню
>>12695 >ну не верю я в то что у такого олуха есть почитатели/воздыхатели, способные вот так вот впрячься за какую-то ничего не значащую для других фигню Я считаю, что я достаточно прямо выразил свою точку зрения. Сошлись два идиота, один из которых прочитал ОП-пост лучше. Ты не веришь в то, что того, кто обзывается, тоже могут обозвать? Мои посты:>>12637>>12655>>12656>>12670>>12675>>12685>>12699
>>12699 Я не верю в то что кто-то взялся отстаивать позицию, которая имеет значение только для выразившего ее.
>>12700 Ссыку на отстаивание мной чье-то позиции в студию. Что-то я не помню такого. Если ты не заметил, >>12673 отвечает мне и ему отвечаю тоже я.
>>12685 >Мне глубоко фиолетово, что будет, если поделить на ноль сделать френд для функции с нестатическими переменными. какие все умные задним числом. Но спросил то ты именно об этом. А если бы подумал сразу - не спрашивал бы. >Мне нужно дать одно окружение двум функциям. Извини за мой французский, но если тебе изначально надо было именно это, то ты либо тролль, либо дурак.
>>12704 >какие все умные задним числом. Но спросил то ты именно об этом. А если бы подумал сразу - не спрашивал бы. Заднее число? Ну ты и лолка. Давай по-другому. Представь себе, что я спросил не "как сделать френд для функции", а "как сделать френд для класса". И тут ты, такой, говоришь, что класс может быть ещё не создан или уже уничтожен. Вот это новость, прикинь, класс может быть ещё не создан! А уж если он уничтожен, то ваще пипец! >Извини за мой французский, но если тебе изначально надо было именно это, то ты либо тролль, либо дурак. Хоть горшком назови.
>>12707 Ты правда дурак или прикидываешься? Предположим я закрою глаза на то что friend'ить функцией класс - это впринципе единственная возможность что-то заfriend'ить. Вполне себе доходчиво описанная в книгах и статьях. Но >класс не создан Почему ты месишь в одну кучу экземпляр класса и сам класс?
>>12709 Вот, смотри, ты начинаешь догонять до того, что реплика о ещё не созданных или уже истреблённых переменных была не совсем умной.
>>12710 Умность - понятие субъективное. Я же говорил о конкретном факте. Если хочешь доказать мне ложность моего изначального утверждения про stackframe и существование переменных, размещаемых в нем - то вперед. До тех пор я буду называть кошку кошкой, а идиотизм - идиотизмом. Пишу я на самом деле потому что мне интересно, насколько агрессивные и упорные нынче пошли невежды.
>>12711 Есть какая-то причина для того, чотбы называть меня невеждой? Или, если ты до сих пор галлюцинациями страдаешь, вот на это ответь: >>Ссыку на отстаивание мной чье-то позиции в студию. >До тех пор я буду называть кошку кошкой, а идиотизм - идиотизмом. Чья-то (твоя? Не знаю) реплика о ещё не созданных или уже истреблённых переменных и есть идиотизм, давай с этого начнём. А если точнее - формализм в отношении чего-то не имеющего никакой формальности. У GCC есть локальные функции - офигеть, как же быть, если переменные ещё не созданы, а локальная функция уже вызвана. А она, представь себе, не может быть вызвана, если не был вызван предок. Оказывается, никакой дилеммы нет? Функция, представь себе, может выполняться не в одном потоке, то есть её окружений может быть несколько. Вот тебе и экземпляры.
>>12712 >У GCC есть локальные функции Это ты так nested functions обозвал? И тебя не смущает то что они видны исключительно внутри функции, в которой определены?
>>12716 Мне большее и не нужно. Я же писал выше: хочу выделять куски алгоритма в блоки так, чтобы это было читаемо. К примеру: сесть_в_автобус() { подойти_к_двери(); запрыгнуть_на_ступеньку(); //инбифо низкопольные автобусы оплатить_проезд(); } И где-нибудь в конце функции сесть-в_автобус - все определения. Вложенных функциям видны все переменные видные в вызываающем блоке, поэтому им ничего передавать не нужно. Альтернатива - использовать goto и поддерживать правильные метки.
>>12717 сесть_в_автобус() { { //подойти_к_двери } { //запрыгнуть_на_ступеньку инбифо низкопольные автобусы } { //оплатить_проезд } }
>>12719 Это немного не то. Мне нужно перенести код, содержащий трудночитаемые операции, в другое место. Конечно, я могу запихнуть его в блоки, но их нужно сворачивать. Я не слышал о том, что можно сделать чтобы IDE сворачивала код сама, опираясь на какие-то указания.
>>12720 > сделать так, чтобы IDE сворачивала код сама
>>12720 Но почему ты продолжаешь спрашивать свой вопрос в то время когда сам дал на него же ответ? Или ты вдруг не знаешь что методы класса можно реализовать не только при описании самого класса?
>>12722 >Но почему ты продолжаешь спрашивать свой вопрос где
>>12723 Вот тут: >я додумался до ещё более простого - сделать класс, в нём определить все переменные, и вызывать метод класса, а дальше методы одного класса могут вызывать друг друга и ничего не передавать друг другу и использовать одни переменные. Или ты будешь говорить что >>12685 это не ты?
>>12724 >Но почему ты продолжаешь спрашивать свой вопрос >>где >Вот тут: Это ответ, а не вопрос. Где ты видишь повторение вопроса ниже по тексту? наркоман штоле :3
>>12725 Наркоман здесь только ты. Но я упорный, поэтому продолжу тыкать тебя носом в твой же бред: >>12720 >Мне нужно перенести код, содержащий трудночитаемые операции, в другое место. >>12717 >Мне большее и не нужно. Я же писал выше: хочу выделять куски алгоритма в блоки так, чтобы это было читаемо. Это вопросы, ответом на которые служит тобою же написанное ранее >я додумался до ещё более простого - сделать класс, в нём определить все переменные, и вызывать метод класса, а дальше методы одного класса могут вызывать друг друга и ничего не передавать друг другу и использовать одни переменные.
>>12727 >Это вопросы Подзравляю, ты наркоман. Это не вопросы.
Задрали вы уже друг перед другом выделываться! Всё равно же в Ад едем!
>>12731 Тогда удаляй нить раз это не вопросы. Зачем ты изливаешь сюда поток сознания если не хочешь читать то что тебе о нем говорят? Уютный бложик можно завести на других ресурсах.
>>12733 shut up bitch
>>12733 >Зачем ты изливаешь сюда поток сознания если не хочешь читать то что тебе о нем говорят? Если не хочу - изливать не буду. А ты подумал, что я не хочу? >>12732 "Можно ехать и ЕХАТЬ." - говорит Daniel в русском переводе Taxi.
>>12735
Пользуясь случаем, хочу спросить. Реализация класса в hpp-файле допустима? А то у меня ошибки "multiple definition of" при линковке старого проекта. Видимо, надо все классы разделять на h и cpp. Или не надо? C++-нуб со стажем 10+ лет
>>12739 Инклуд - это буквальная вставка файла. Если такая вставка приводит к конфликтам, то ты делаешь что-то неверно.
>>12739 Header может подключаться несколько раз для одной единицы компиляции (cpp-файла). Стоит завернуть его содержимое в ifndef: #ifndef some_unique_header_name #define some_unique_header_name // содержимое .h/.hpp-файла #endif в конкретных реализациях могут быть специальные прагмы для этого, но они в общем случае непортируемы
>>12751 Да не, ифдефы были. Спасибо, я разобрался. Просто все cpp-файлы ведь собираются по-отдельности. И один из классов, который я реализовывал прямо в hpp-файле был включен в два разных cpp, которые, естественно, не могли слинковаться. Так что я просто разделил этот hpp на hpp+cpp. И планирую проделать это в дальнейшем с остальными классами.
Вопрос. Как можно интегрировать/инлайнить std/stl во время компиляции? Вот sort для массива целых чисел, например, будет вызывать функцию для каждого сравнения. Или не будет? Я не знаю, как она реализована, но я хотел бы, чтобы функция сравнения была заинлайнена. Или я чего-то не понимаю, и на самом деле компилятор делает всё по-умному?
>>12804 Функция сравнения обычно будет "заинлайнена", если её тело находится в той же единице компиляции, что и вызов (то есть, если код её тела находится в том же файле или в подключенном заголовочном файле), и включена оптимизация. Если код функции сравнения находится в другом *.cpp файле, то обычно (когда не применяется link-time optimization) компилятор его просто не видит в тот момент, когда можно "инлайнить".
>>12806 Что такое инлайн и его основные принципы я знаю. Меня интересует интеграция STDlib/STL в код.
>>12806 И, в частности, мне интересно, будут ли вызовы компаратора эффективными. Или будут ли вызовы стандартных методов эффективными/заинлайнеными, или это будут те же call/jmp.
>>12810 > будут ли вызовы стандартных методов эффективными/заинлайнеными Каких стандартных? std::less<T> и прочих? Да, будут, они же в header'ах определены. Возьми g++ -O -S -masm=intel и посмотри.
>>12811 >Каких стандартных? Ну, не только less<T>. Будут инлайниться только те, которые определены в заголовках? Тогда я сам айду. Ты не читаешь другие части моих постов. Есть процедура sort, она принимает указатель на компаратор. Вопрос: компаратор будет заинлайнен внутри sort, или это невозможно?
>>12814 > Есть процедура sort, она принимает указатель на компаратор. Вопрос: компаратор будет заинлайнен внутри sort, или это невозможно? О какой процедуре sort ты говоришь? Если об std::sort, то она шаблонная, поэтому она определяется в заголовочном файле, то есть инлайнингу ничто не препятствует. Если это какая-то другая sort и тело этой sort с телом компаратора после обработки препроцесcором не оказываются в одной единице трансляции, то в этом случае инлайнинга не будет.
>>12819 >Если об std::sort, то она шаблонная, поэтому она определяется в заголовочном файле, то есть инлайнингу ничто не препятствует. Как оказалось - таки препятствует. Ккомпаратор будет заинлайнен внутри sort только в том случае, если я передаю функтор. Правильно?
>>12820 > Ккомпаратор будет заинлайнен внутри sort только в том случае, если я передаю функтор. А как передать в std::sort не функтор? Если ты имеешь в виду просто вызов std::sort с двумя итераторами, то ясно, что если operator< для объектов того типа, на который указывает итератор, определён не в заголовочном файле (или он виртуальный), то его не заинлайнить.
>>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 Пишут, что если передавать функтор, всё всем инлайнится. Или я чего-то не понимаю?
>>12820 > Как оказалось - таки препятствует. Если компилятору во время компиляции известно, куда именно указывает указатель на функцию, то теоретически он может заинлайнить её. В случае GCC помогает объявление __attribute__((flatten)) для функции, из которой происходит вызов std::sort. >>12822 > Придумал я свой класс, определил в них операторы сравнения, использую sort с двумя итераторами (компаратор по-умолчанию) - что же, метод сравнения не будет заинлайнен? Нужно тело оператора сравнения определять в header'е, тогда всё будет хорошо.
>>12824 О, хорошо сказал. То есть, чтобы всьо инлайнилось, надо: 1) использовать только те функции, реализация которых есть в боилерплейте, внутри которого мне нужны инлайны; 2) передавать функторы вместо указателей; 3) или писать "flatten". Олсо: что есть link time optimization?
>>12826 Link time optimization - прямо таки то, что значит название - оптимизация во время линковки obj-файлов между собой. Один obj-файл - один cpp-файл. Соответственно, что-то такое более мощное, чем оптимизация каждого по-отдельности. Вроде бы lte должно уменьшать размер бинарника. мимо-проходил-кун
>>11826 Передавать функторы в этом плане надёжней, нежели полагаться на специфичные для компилятора расширения или опции вроде -findirect-inlining.
- wahaba + wakaba 3.0.9 + futaba + futallaby -