RO>Вызов операторов-членов не применяет пользовательские преобразования типов к левому операнду, поэтому все симметричные операторы должны >быть друзьями.
в случае унарных операторов не так все очевидно, так что можно порассуждать о преимуществах и недостатках разных способов перегрузки.
> у Саттера кажется, было рассуждение по поводу нужно ли проверять ошибки распределения памяти в new. сводится оно примерно к следующему: > в системах с виртуальной памятью память "есть" всегда , если же ее нет то значит система в состоянии аварийного завершения. > единственное что тут можно сделать это записать ошибку в лог (что может тоже не сработать т.к. места на диске уже нет) >
Чересчур сильный вывод. При запуске 32-битных приложений на 64-битной винде вполне возможна ситуация, когда память (адресное пространство) для конкретного приложения кончилась, но система в целом продолжает работать. В принципе, нетрудно также представить себе 32-битную (или любой другой разрядности) операционку, которая умеет работать со свопфайлом, превышающим по размеру 2^32 байт.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Alex Alexandrov, Вы писали:
AA>>Вообще-то, в дебаге область локальных переменных заполняется 0xCC, а не нулями.
RO>Вообще-то, кроме MSVS есть и более другие IDE.
Вообще-то, IDE тут совершенно не при чем. Лишь компилятор имеет значение в рассматриваемом вопросе.
RO>Да и для MSVS всё не так просто: http://rsdn.ru/forum/message/1237078.1.aspx
За ссылку спасибо — как раз ее искал, найти не мог. В высказывании выше я, правда, довольно однозначно указываю на "область локальных переменных". Соответственно, там всегда 0xcc.
It's kind of fun to do the impossible (Walt Disney)
Здравствуйте, alpha21264, Вы писали:
A>бросают исключения, ловят, сообщают пользователю, и сохраняют текущее состояние A>данных до начала операции (транзакции). A>Критерий профессионализма.
Профессионалов-сообщателей пользователям (особенно в виде модальных диалог боксов вроде "не могу открыть лог файл" и прочих очень нужных, полезных, а главное, понятных пользователю сообщений) нужно публично пороть на главной площади. До прозрения.
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, OdesitVadim, Вы писали:
NB>>>дык вопрос был не в том, компилируется, или нет, а в том что выводит. NB>>>при двухфазном поиске вызовется глобальня функция и прога ничего не напечатает.
OV>>ну а последненький gcc поддерживает двухвазный поиск?
NB>поддерживает. NB>gcc 3.4.2 ничего не печатает.
Здравствуйте, jazzer, Вы писали:
E>>у моих подчинённых и использование своих шаблонов запрещенно... J>А у нас ничего не запрещено
Да это как кому удобно. Лишь бы программы хорошие были, продавались и приносили людям пользу
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, alpha21264, Вы писали:
A>>Просто, если ты студент, то специально для тебя проведу ликбез. RO>Я крайне рад тому, что в этом отношении составляю компанию Андрею Александреску, поскольку имею возможность выслушать превосходную лекцию. Жду с нетерпением.
Молодец! Хвалю.
То, что ты читаешь Александреску, безусловно тебе плюс.
Такое простое решение я не знал. Ты спихнул всю работу на компилятор.
Но то что ты привел содержит две ошибки.
1) Ты не проверяешь на присвоение обьекта самому себе (в этом случае
происходит ненужный захват и освобождение памяти).
2) В задании члены класса являются базовыми типами (то есть у них нет
конструкторов деструкторов и операции swap). Это сделано намерено —
чтобы твой вариант не работал
Мне вспоминается мой учитель по матану. Он как-то нам дал задание
взять производные простых функций не пользуясь известными нам
формулами. То есть пользуясь только пределами. И привел такую аналогию.
Вы можете проехать стометровку на мотоцикле. Это будет быстрее, чем
пробежать ее. Но будет потерян смысл бега на сто метров — тренировка.
Правда это все мелочи. Смысл в другом.
Оператор присваивания — это просто функция. Тебе ведь придется писать не
только операторы присваивания Когда ты делаешь операцию над обьектом,
операция может завершиться неудачей. Это может быть не только из-за отсутсвия
памяти. Это может быть отсутсвие файла, неправильные данные от пользователя,
синтаксическая ошибка или просто твой коллега плохо написал свой кусок кода
и у него индекс вышел за границы массива. Короче — "не получилось". В этом
функция должна бросить исключение (или вернуть код ошибки) и оставить обьект
в состоянии, которое было до операции. Ну и разумеется, при этом не должно
быть утечек памяти. Так нужно писать ЛЮБУЮ функцию. Оператор присваивания
это только частный случай.
Зачем это нужно? Ну например секретарша целый день писала "очень важный" отчет.
В последний момент она решила вставить "очень нужную" диаграмму. Вывалиться по
недостатку памяти — значит угробить ее дневную работу.
Основную идею ты наверное уже понял.
1) Нужно создать новый обьект. Все изменения делать с ним.
2) Если операция прошла успешно, то новый обьект заменяет старый.
3) Если операция прошла неуспешно, то новый обьект уничтожается
(старый остается неизменным).
Я не могу сейчас найти статью, где все это рассматривается очень подробно.
Приводится около десяти различных реализаций оператора присваивания,
(каждая все длиннее и сложнее предыдущей ) при этом рассказывается
какие ошибки допущены в каждой реализации. Воспроизвести по памяти могу,
но это будет уже не так качественно как в оригинале.
Как найду эту статью, помещу ссылку в конференцию.
ЗЫ1. (То что к делу не относится)
RO>Трудное это дело, когда термины придумываются на английском языке, а потом переводятся безграмотными переводчиками.
Даже торговец шерстью должен думать не только о том, чтобы подешевле купить
и подороже продать, но и о том, чтобы беспрепятсвенно могла осуществляться торговля.
Говорить все равно надо по-русски, если мы хотим сохранить СВОЮ страну и свою "техническую
культуру". Это только кажется, что без разницы на каком языке сказать. На самом деле
каждое занесенное в язык иностранное слово увеличивает барьер вхождения для будующих
студентов. А отсутсвие литературы на родном языке поднимает этот барьер до непреодолимого.
RO>>>>>
Не будь "слишком умным". То, что ты написал правильно с точки зрения компьютера,
но непривычно для человека. Я увидел, что перед other отсутсвует & только после
того, как ты сказал Я ошибся, но ведь здесь было легко ошибиться.
В мое время не рекомендовали писать вот так x=a[--i++] а рекомендовал так x=a[i-1]
ЗЫ2.
ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ.
Другое дело, что оно не позволяет оценить, умеешь ли ты писать
Здравствуйте, alpha21264, Вы писали:
A>Такое простое решение я не знал. Ты спихнул всю работу на компилятор.
Вот это сильно. Тут народ бьется, ночей не спит, чтоб как можно больше возложить на компилятор, а по-твоему, оказывается, это проблема (наверное, надо вообще гуманнее относиться к компилятору, не напрягать его всякими сиплюсплюсами и писать на ассемблере )
A>Но то что ты привел содержит две ошибки. A>1) Ты не проверяешь на присвоение обьекта самому себе (в этом случае A> происходит ненужный захват и освобождение памяти).
Это не ошибка. Это просто отсутствие оптимизации.
Вроде у тебя не было условия "реализовать максимально эффективно по такому-то критерию"
A>2) В задании члены класса являются базовыми типами (то есть у них нет A> конструкторов деструкторов и операции swap). Это сделано намерено — A> чтобы твой вариант не работал
std::swap — шаблонная попробуй на досуге позвать ее как-нть так:
int x=1, y=2;
std::swap(x, y);
Вот тебе на всякий случай цитата из Стандарта:
25.2.2 Swap [lib.alg.swap]
template<class T> void swap(T& a, T& b);
1 Requires: Type T is CopyConstructible (20.1.3) and Assignable (23.1).
2 Effects: Exchanges values stored in two locations.
A>взять производные простых функций не пользуясь известными нам A>формулами. То есть пользуясь только пределами.
Тогда так и надо ставить условие задачи: "Решить, не пользуясь А, Б, Ц"
A>Так нужно писать ЛЮБУЮ функцию.
То, что ты описал — это строгая гарантия безопасности исключений.
Совсем необязательно добиваться именно ее.
Иногда она просто не нужна по характеру задачи, иногда ее реализация приводит к неприемлемым накладным расходам, иногда ее невозможно добиться в принципе.
Для таких случаев достаточно добиться базровой гарантии (т.е. отсутствия утечек и некорректного состояния).
A>Зачем это нужно? Ну например секретарша целый день писала "очень важный" отчет. A>В последний момент она решила вставить "очень нужную" диаграмму. Вывалиться по A>недостатку памяти — значит угробить ее дневную работу.
A>Основную идею ты наверное уже понял. A>1) Нужно создать новый обьект. Все изменения делать с ним. A>2) Если операция прошла успешно, то новый обьект заменяет старый. A>3) Если операция прошла неуспешно, то новый обьект уничтожается A> (старый остается неизменным).
У тебя объект — трехгигабайтная матрица. Твои действия?
A>Не будь "слишком умным".
Характерный аргумент. Работал я как-то с таким менеджером. Говорит: "Делай А". Я в ответ: "Нельзя А, надо Б, потому что (лекция на полчаса)". Он: "Не умничай".
A>То, что ты написал правильно с точки зрения компьютера, A>но непривычно для человека.
Значит, надо набирать таких человеков, для которых это привычно.
Если, конечно, не стоит задачи экономить на программистах.
A>Я увидел, что перед other отсутсвует & только после A>того, как ты сказал Я ошибся, но ведь здесь было легко ошибиться.
Ну вот эта придирка по делу. В таких случаях хороший программист поставит соответствующий комментарий.
A>ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ. A>Другое дело, что оно не позволяет оценить, умеешь ли ты писать
Вполне позволяет.
Sapienti sat.
Здравствуйте, alpha21264, Вы писали:
A>>>Просто, если ты студент, то специально для тебя проведу ликбез. RO>>Я крайне рад тому, что в этом отношении составляю компанию Андрею Александреску, поскольку имею возможность выслушать превосходную лекцию. Жду с нетерпением.
A>Молодец! Хвалю. A>То, что ты читаешь Александреску, безусловно тебе плюс.
А где я признавался, что читал Александреску? ;-)
A>Такое простое решение я не знал. Ты спихнул всю работу на компилятор.
A>Но то что ты привел содержит две ошибки. A>1) Ты не проверяешь на присвоение обьекта самому себе
Саттер заявляет, что operator =, который неправильно работает в случае самоприсваивания, наверняка не exception safe.
A>(в этом случае происходит ненужный захват и освобождение памяти)
А это уже правило Кнута, которое придумал Хоар в 70-х гг.: premature optimization is the root of all evil.
A>2) В задании члены класса являются базовыми типами (то есть у них нет A> конструкторов деструкторов и операции swap). Это сделано намерено — A> чтобы твой вариант не работал :)
У всех типов C++ есть и то, и другое, и третье, если только программер явно их не убрал.
A>Мне вспоминается мой учитель по матану. Он как-то нам дал задание A>взять производные простых функций не пользуясь известными нам A>формулами. То есть пользуясь только пределами. И привел такую аналогию. A>Вы можете проехать стометровку на мотоцикле. Это будет быстрее, чем A>пробежать ее. Но будет потерян смысл бега на сто метров — тренировка.
Это те веселые примеры вроде y = x^2 cos(1/x)?
A>Правда это все мелочи. Смысл в другом.
A>Оператор присваивания — это просто функция. Тебе ведь придется писать не A>только операторы присваивания :) Когда ты делаешь операцию над обьектом, A>операция может завершиться неудачей. Это может быть не только из-за отсутсвия A>памяти. Это может быть отсутсвие файла, неправильные данные от пользователя, A>синтаксическая ошибка или просто твой коллега плохо написал свой кусок кода A>и у него индекс вышел за границы массива. Короче — "не получилось". В этом A>функция должна бросить исключение (или вернуть код ошибки) и оставить обьект A>в состоянии, которое было до операции. Ну и разумеется, при этом не должно A>быть утечек памяти. Так нужно писать ЛЮБУЮ функцию. Оператор присваивания A>это только частный случай.
A>Зачем это нужно? Ну например секретарша целый день писала "очень важный" отчет. A>В последний момент она решила вставить "очень нужную" диаграмму. Вывалиться по A>недостатку памяти — значит угробить ее дневную работу.
А я с этим спорил? Я же уже привел раньше по курсу фрагмент (псевдо)кода именно с этой семантикой:
void onDiagramButtonClick()
{
try
{
askUserWhatDiagramSheDesiresAndPlaceIt();
}
catch(std::exception const& e)
{
logEvent(e.what());
alertUser("Failed to create a diagram");
}
}
A>Основную идею ты наверное уже понял. A>1) Нужно создать новый обьект. Все изменения делать с ним. A>2) Если операция прошла успешно, то новый обьект заменяет старый. A>3) Если операция прошла неуспешно, то новый обьект уничтожается A> (старый остается неизменным).
Ну так вот же моя реализация: RO>>>>>>
RO>>>>HelloSutter& HelloSutter::operator =(HelloSutter other) // новый объект
RO>>>>{
RO>>>> swap(other); // заменить
RO>>>> return *this;
RO>>>>}
RO>>>>
A>Я не могу сейчас найти статью, где все это рассматривается очень подробно. A>Приводится около десяти различных реализаций оператора присваивания, A>(каждая все длиннее и сложнее предыдущей :) ) при этом рассказывается A>какие ошибки допущены в каждой реализации. Воспроизвести по памяти могу, A>но это будет уже не так качественно как в оригинале.
A>Как найду эту статью, помещу ссылку в конференцию.
A>ЗЫ1. (То что к делу не относится)
RO>>Трудное это дело, когда термины придумываются на английском языке, а потом переводятся безграмотными переводчиками.
A>Даже торговец шерстью должен думать не только о том, чтобы подешевле купить A>и подороже продать, но и о том, чтобы беспрепятсвенно могла осуществляться торговля. A>Говорить все равно надо по-русски, если мы хотим сохранить СВОЮ страну и свою "техническую A>культуру". Это только кажется, что без разницы на каком языке сказать. На самом деле A>каждое занесенное в язык иностранное слово увеличивает барьер вхождения для будующих A>студентов. А отсутсвие литературы на родном языке поднимает этот барьер до непреодолимого.
Ну да, непреодолимого. Я читал по-английски и The Lord of the Rings, и Exceptional C++.
И тем более, свою страну я сохраню, зачем мне ваша? ;-)
RO>>>>>>
A>Не будь "слишком умным". То, что ты написал правильно с точки зрения компьютера, A>но непривычно для человека. Я увидел, что перед other отсутсвует & только после A>того, как ты сказал :) Я ошибся, но ведь здесь было легко ошибиться. A>В мое время не рекомендовали писать вот так x=a[--i++] а рекомендовал так x=a[i-1]
А первое — UB, так нужно не только не рекомендовать, а по рукам бить.
A>ЗЫ2.
A>ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ.
Спасибо :-)
A>Другое дело, что оно не позволяет оценить, умеешь ли ты писать :)
Так всегда же можно спросить, почему именно так.
Здравствуйте, Awaken, Вы писали:
A>надо для собеседования A>большинство вопросов которые обычно задают, либо очень банальны ("для чего нужны смарт-пойнтеры"), A>либо из серии знаешь/не знаешь. A>интересный и умный вопрос — когда к ответу приходишь логическим путем, а не просто "знаешь" A>парочка вопросов которые мне понравились: A>-почему в С++ нельзя реализовать полноценный сборщик мусора? A>-в каких ситуациях перегрузка левого ++ лучше чем правого
Voobshe kto znaet pok kakie tseli sozdavalsia C++.S tsego natsali i k tsemu prisli.
Sto nado programmirovat na C++ a sto nenado.Eto glavnoe.A programmirovanie na C++ eto bolshe vsego znaesh ne
znaesh, i naskolko vnimatelno tsitaesh dokumentatsiu i ponimaesh tsusoi kod(stsitai opit).Kstati ,samo programmirovanie ne otsen to i umnaia nauka no trebuet bolsoi usidtsivosti.A esli oprasivaemii umnee sprashivaiusego?
...просканировал тему, вроде бы не задавали.
Впрочем, подобный вопрос подходит для любого языка.
Точнее, вопросов два:
— скажите, что в языке вам НЕ НРАВИТСЯ
— обьясните, эту проблему (проблемы) вы обходите
Готовых ответов и их реакций на них предложить не могу.
Для любого языка, который я знаю — не только C++.
Но, он позволяет многое узнать о претенденте и его предпочтениях.
__________
16.There is no cause so right that one cannot find a fool following it.