Re[3]: придумал (операторы)
От: Awaken Украина  
Дата: 20.08.07 09:18
Оценка:
RO>Вызов операторов-членов не применяет пользовательские преобразования типов к левому операнду, поэтому все симметричные операторы должны >быть друзьями.

в случае унарных операторов не так все очевидно, так что можно порассуждать о преимуществах и недостатках разных способов перегрузки.
Re[8]: придумайте умный вопрос по с++
От: Sergey Россия  
Дата: 20.08.07 11:56
Оценка:
> у Саттера кажется, было рассуждение по поводу нужно ли проверять ошибки распределения памяти в new. сводится оно примерно к следующему:
> в системах с виртуальной памятью память "есть" всегда , если же ее нет то значит система в состоянии аварийного завершения.
> единственное что тут можно сделать это записать ошибку в лог (что может тоже не сработать т.к. места на диске уже нет)
>

Чересчур сильный вывод. При запуске 32-битных приложений на 64-битной винде вполне возможна ситуация, когда память (адресное пространство) для конкретного приложения кончилась, но система в целом продолжает работать. В принципе, нетрудно также представить себе 32-битную (или любой другой разрядности) операционку, которая умеет работать со свопфайлом, превышающим по размеру 2^32 байт.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[7]: придумайте умный вопрос по с++
От: Alex Alexandrov США  
Дата: 20.08.07 18:25
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Alex Alexandrov, Вы писали:


AA>>Вообще-то, в дебаге область локальных переменных заполняется 0xCC, а не нулями.


RO>Вообще-то, кроме MSVS есть и более другие IDE.


Вообще-то, IDE тут совершенно не при чем. Лишь компилятор имеет значение в рассматриваемом вопросе.

RO>Да и для MSVS всё не так просто: http://rsdn.ru/forum/message/1237078.1.aspx
Автор: Кодёнок
Дата: 23.06.05


За ссылку спасибо — как раз ее искал, найти не мог. В высказывании выше я, правда, довольно однозначно указываю на "область локальных переменных". Соответственно, там всегда 0xcc.
It's kind of fun to do the impossible (Walt Disney)
Re[6]: придумайте умный вопрос по с++
От: landerhigh Пират  
Дата: 21.08.07 00:16
Оценка: +1
Здравствуйте, alpha21264, Вы писали:

A>бросают исключения, ловят, сообщают пользователю, и сохраняют текущее состояние

A>данных до начала операции (транзакции).
A>Критерий профессионализма.
Профессионалов-сообщателей пользователям (особенно в виде модальных диалог боксов вроде "не могу открыть лог файл" и прочих очень нужных, полезных, а главное, понятных пользователю сообщений) нужно публично пороть на главной площади. До прозрения.
Re[11]: придумайте умный вопрос по с++
От: superman  
Дата: 21.08.07 08:16
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, OdesitVadim, Вы писали:


NB>>>дык вопрос был не в том, компилируется, или нет, а в том что выводит.

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

OV>>ну а последненький gcc поддерживает двухвазный поиск?


NB>поддерживает.

NB>gcc 3.4.2 ничего не печатает.

gcc version 4.1.2 — аналогично.
Re[3]: придумайте умный вопрос по с++
От: jazzer Россия Skype: enerjazzer
Дата: 21.08.07 10:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>у моих подчинённых и использование своих шаблонов запрещенно...


А у нас ничего не запрещено
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: придумайте умный вопрос по с++
От: Lorenzo_LAMAS  
Дата: 21.08.07 11:40
Оценка: 1 (1)
http://groups.google.ru/group/comp.lang.c++.moderated/browse_thread/thread/311a042a5b485b41/2d84c5b258ead4bc?hl=ru#2d84c5b258ead4bc
Of course, the code must be complete enough to compile and link.
Re[4]: придумайте умный вопрос по с++
От: Erop Россия  
Дата: 21.08.07 13:45
Оценка: +1 :)
Здравствуйте, jazzer, Вы писали:

E>>у моих подчинённых и использование своих шаблонов запрещенно...

J>А у нас ничего не запрещено

Да это как кому удобно. Лишь бы программы хорошие были, продавались и приносили людям пользу
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: придумайте умный вопрос по с++
От: alpha21264 СССР  
Дата: 21.08.07 20:43
Оценка: 7 (1) -2 :))) :)
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, alpha21264, Вы писали:




A>>Просто, если ты студент, то специально для тебя проведу ликбез.

RO>Я крайне рад тому, что в этом отношении составляю компанию Андрею Александреску, поскольку имею возможность выслушать превосходную лекцию. Жду с нетерпением.


Молодец! Хвалю.
То, что ты читаешь Александреску, безусловно тебе плюс.
Такое простое решение я не знал. Ты спихнул всю работу на компилятор.

Но то что ты привел содержит две ошибки.
1) Ты не проверяешь на присвоение обьекта самому себе (в этом случае
происходит ненужный захват и освобождение памяти).
2) В задании члены класса являются базовыми типами (то есть у них нет
конструкторов деструкторов и операции swap). Это сделано намерено —
чтобы твой вариант не работал

Мне вспоминается мой учитель по матану. Он как-то нам дал задание
взять производные простых функций не пользуясь известными нам
формулами. То есть пользуясь только пределами. И привел такую аналогию.
Вы можете проехать стометровку на мотоцикле. Это будет быстрее, чем
пробежать ее. Но будет потерян смысл бега на сто метров — тренировка.

Правда это все мелочи. Смысл в другом.

Оператор присваивания — это просто функция. Тебе ведь придется писать не
только операторы присваивания Когда ты делаешь операцию над обьектом,
операция может завершиться неудачей. Это может быть не только из-за отсутсвия
памяти. Это может быть отсутсвие файла, неправильные данные от пользователя,
синтаксическая ошибка или просто твой коллега плохо написал свой кусок кода
и у него индекс вышел за границы массива. Короче — "не получилось". В этом
функция должна бросить исключение (или вернуть код ошибки) и оставить обьект
в состоянии, которое было до операции. Ну и разумеется, при этом не должно
быть утечек памяти. Так нужно писать ЛЮБУЮ функцию. Оператор присваивания
это только частный случай.

Зачем это нужно? Ну например секретарша целый день писала "очень важный" отчет.
В последний момент она решила вставить "очень нужную" диаграмму. Вывалиться по
недостатку памяти — значит угробить ее дневную работу.

Основную идею ты наверное уже понял.
1) Нужно создать новый обьект. Все изменения делать с ним.
2) Если операция прошла успешно, то новый обьект заменяет старый.
3) Если операция прошла неуспешно, то новый обьект уничтожается
(старый остается неизменным).

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

Как найду эту статью, помещу ссылку в конференцию.

ЗЫ1. (То что к делу не относится)

RO>Трудное это дело, когда термины придумываются на английском языке, а потом переводятся безграмотными переводчиками.


Даже торговец шерстью должен думать не только о том, чтобы подешевле купить
и подороже продать, но и о том, чтобы беспрепятсвенно могла осуществляться торговля.
Говорить все равно надо по-русски, если мы хотим сохранить СВОЮ страну и свою "техническую
культуру". Это только кажется, что без разницы на каком языке сказать. На самом деле
каждое занесенное в язык иностранное слово увеличивает барьер вхождения для будующих
студентов. А отсутсвие литературы на родном языке поднимает этот барьер до непреодолимого.

RO>>>>>
RO>>>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>>>{
RO>>>    swap(other);
RO>>>    return *this;
RO>>>}
RO>>>


Не будь "слишком умным". То, что ты написал правильно с точки зрения компьютера,
но непривычно для человека. Я увидел, что перед other отсутсвует & только после
того, как ты сказал Я ошибся, но ведь здесь было легко ошибиться.
В мое время не рекомендовали писать вот так x=a[--i++] а рекомендовал так x=a[i-1]

ЗЫ2.

ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ.
Другое дело, что оно не позволяет оценить, умеешь ли ты писать

Течёт вода Кубань-реки куда велят большевики.
Re[8]: придумайте умный вопрос по с++
От: jazzer Россия Skype: enerjazzer
Дата: 22.08.07 14:28
Оценка:
Здравствуйте, 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.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: придумайте умный вопрос по с++
От: Roman Odaisky Украина  
Дата: 22.08.07 20:55
Оценка:
Здравствуйте, 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>>>>>>
RO>>>>HelloSutter& HelloSutter::operator =(HelloSutter other)
RO>>>>{
RO>>>>    swap(other);
RO>>>>    return *this;
RO>>>>}
RO>>>>


A>Не будь "слишком умным". То, что ты написал правильно с точки зрения компьютера,

A>но непривычно для человека. Я увидел, что перед other отсутсвует & только после
A>того, как ты сказал :) Я ошибся, но ведь здесь было легко ошибиться.
A>В мое время не рекомендовали писать вот так x=a[--i++] а рекомендовал так x=a[i-1]

А первое — UB, так нужно не только не рекомендовать, а по рукам бить.

A>ЗЫ2.


A>ТВОЕ РЕШЕНИЕ ПРАВИЛЬНОЕ.

Спасибо :-)

A>Другое дело, что оно не позволяет оценить, умеешь ли ты писать :)

Так всегда же можно спросить, почему именно так.
До последнего не верил в пирамиду Лебедева.
Re[2]: Reverse строки
От: Пётр Седов Россия  
Дата: 23.08.07 12:32
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:
RO>развернуть строку задом наперед.
Была ветка
Автор:
Дата: 30.10.06
про reverse строки.
Пётр Седов (ушёл с RSDN)
Re: придумайте умный вопрос по с++
От: spider1970  
Дата: 23.08.07 21:35
Оценка:
Здравствуйте, 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?
Re: окончательный вопрос
От: 0xDEADBEEF Ниоткуда  
Дата: 23.08.07 22:19
Оценка: 1 (1)
Здравствуйте, Awaken, Вы писали:

...просканировал тему, вроде бы не задавали.
Впрочем, подобный вопрос подходит для любого языка.

Точнее, вопросов два:
— скажите, что в языке вам НЕ НРАВИТСЯ
— обьясните, эту проблему (проблемы) вы обходите

Готовых ответов и их реакций на них предложить не могу.
Для любого языка, который я знаю — не только C++.
Но, он позволяет многое узнать о претенденте и его предпочтениях.
__________
16.There is no cause so right that one cannot find a fool following it.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.