Здравствуйте, puremind, Вы писали:
P>А можно еще структурные паттерны проектирования вспомнить ...
Ну... мне нечего вспоминать на этот счёт — не знаю я этого
Можно ссылочку (на открытый проект) на пример реального кода, где используются ссылки как поля объектов. Или просто привести здесь код, когда вот без это ссылки жизнь становится нехорошей? Просто ну вот не приходит в голову кому и зачем может такое понадобится. Я считаю, что это явный источник трудноуловимых ошибок... буду рад поменять своё мнение, но теперь я, кажется, понимаю, откуда у программистов по статистике 6 ошибок на сто строк... (впрочем, позавчера я тоже сделал 6 ошибок на 100 строк на Nemerle...)
Здравствуйте, FDSC, Вы писали:
<skepped> FDS>Можно ссылочку (на открытый проект) на пример реального кода, где используются ссылки как поля объектов. Или просто привести здесь код, когда вот без это ссылки жизнь становится нехорошей? Просто ну вот не приходит в голову кому и зачем может такое понадобится.<skippe>
опять не из реального проекта, но идея должна быть понятна:
В общем RAII. Не нужно закрывать соединение, оно само закроется.
А также файлы, хэндлы и прочая может быть автомат. освобождены/деинициализированы и т.д.)
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, superman, Вы писали:
S>>Здравствуйте, FDSC, Вы писали:
FDS>>>Я в шоке... кому и зачем такое может понадобиться?
S>>а потом возникают вопросы о проблемах с понимением молодых програмистов
FDS>Я, вообще-то, не C++-программист так что и проблемы возникают не из-за этого
Хм.. а к чему тогда вообще этот разговор? что за привычка учить других тому, в чем сам "не в зуб ногой".
Я С++ програмист. Я отвечу как проинициализировать член-ссылку класа даже если меня разбудить ночью, хоть и начну свой ответ с нецензурных выражений в адрес разбудившего . Так же расскажу что в этом плохого и хорошего. В прошлом я неоднократно использовал такое в своей работе, соглашусь что это было не самым элегантным, но удовлетворительным и единственным доступным мне тогда решением. Я просто недоумеваю по поводу ваших воплей на тему "потерянных ценных сотрудников". я предполагаю что и среди моих знакомых есть знакомые "С++ програмисты" не способные ответить на подобный вопрос но склонен списывать это на их недоученность а никак не на глупость вопроса.
Здравствуйте, puremind, Вы писали:
P>вопрос про ссылки ЭЛЕМЕНТАРНЫЙ — и если человек не знает, не может догадать или вывести гуся из опыта — это серьезный звонок. И можно воздержаться от бездоказательных утверждений типа — "по вашей вине столько хороших сотрудников" ...
А я, например, очень неуверенно себя чувствую, если вынужден догадываться. Откуда вы знаете, может соискатель волнуется, а тут вы его ещё заставляете чувствовать себя ещё более неуверенно... естественно, он может и ошибиться
P>Во первых — хороший сотрудник должен писать хороший код, а это невозможно без знания языка ... P>Во вторых к ссылкам можно еще добавить const-модификаторы, некоторые "профессионалы" не понимают когда и зачем его использовать и не видят разницы между ...
Я не профессионал в C++, но, думаю, отвечу правильно (только не смейтесь, если ошибусь ) и использую эти вещи:
// Неконстантный указатель на константный объект. Т.е. можно изменить указатель, но нельзя значение переменной, на которую он указывает
// Кстати, я всегда пишу int const *, насколько я знаю, это тоже самое... P>сonst int *
// Константный указатель на неконстантный объект. Т.е. переменную можно изменить, но указатель всегда будет указывать именно на эту переменную P>int * const
P>class A P>{ P> void f();
// тут не уверен, если не ошибаюсь, константная функция не изменяет состояния объекта, т.е. все поля в методе константны P> void f() const; P>};
P>А это уже реальный косяк! .. =)
Ну дак вы же после ссылки уже отправите, до констант даже не дойдёт...
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, FDSC, Вы писали:
LM>>>>>Лучше передавать указатель и проверять его на NULL?! FDS>>>>Да, в синтаксисе будет явно видно, что работа ведётся именно с указателем LM>>>А обязан я его проверять на нулл? FDS>>Да можно и не надо LM>А по русски?
Так устроит? (см. пояснения в комментариях)
#include"stdafx.h"#include <conio.h>
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
class C1
{
public:
C1(int &ai): i(&ai), li(ai) // указатель берётся от существующей переменной, ничего проверять на NULL не надо
{
}
int * const i; // указатель константен - его нельзя изменитьint &li; // абсолютно аналогично со ссылкой, её ведь тоже нельзя изменить во время работы
};
class C2
{
public:
void PrintI()
{
cout << i << endl;
}
C1 * GetC1()
{
return c1;
}
C2(int ai)
{
i = ai;
c1 = new C1(i);
}
virtual ~C2()
{
delete c1;
c1 = NULL;
}
private:
int i;
C1 * c1;
};
int _tmain(int argc, _TCHAR* argv[])
{
C2 c2(5);
C1 * c1 = c2.GetC1();
// как и в случае со ссылкой c1->li = 1;
// всё проходит нормально, только мы явно показываем, что изменяем не переменную-поле класса,
// а значение переменной, расположенной по некоторому адресу
c2.PrintI();
*c1->i = 1;
// Попытаемся обнулить указатель - не получится. Код полностью аналогичен коду со ссылкой за исключением напоминания программисту
// что он работает не с переменной, а с указателем на переменную
// c1->i = NULL; // Error 1 error C2166: l-value specifies const object f:\prg\tmp\070530cpplinks\cpplinks\cpplinks.cpp 87
c2.PrintI();
_getch();
return 0;
}
_>может ли существовать такой тип ABC, вообще? Если программист "с лету" говорит "Да, проблем нет." Тогда что делать с правилом инициализации ссылки? Тут можно многое спросить еще, про дефолтный конструктор, как его генерируют и пр. Такие вопросы нужны что-бы отфильтровать шлак и посмотреть видел ли человек C++ вообще.
мы тут на днях встретили в одной библиотеке такой перл:
class Foo;
class A {
public:
A(Foo&);
A();
void do_something();
private:
Foo& m_foo;
bool m_is_foo_ok;
}
A::A(Foo& foo)
: m_foo(foo)
, m_is_foo_ok(true)
{}
A::A(Foo& foo)
: m_foo(*NULL)
, m_is_foo_ok(false)
{}
и тереь внимание в студии, самая главная часть перла:
void A::do_something()
{
if (m_is_foo_ok){
m_foo.do_something();
} else {
// TODO хм.. надо будет подумать как обрабатывать эту ситуёвину
}
}
Здравствуйте, sc, Вы писали:
sc>В общем RAII. Не нужно закрывать соединение, оно само закроется. sc>А также файлы, хэндлы и прочая может быть автомат. освобождены/деинициализированы и т.д.)
Что мешает конструктор Connection вынести прямо в структуру?
Что мешает передать структуре указатель, а не ссылку?
Я не против того, что ссылка может потребоваться, но когда вместо неё нельзя использовать указатель, или можно, но очень неудобно? Я просто не понимаю, почему человек удивляется, что после 6 лет работы программист этого в глаза не видел. Всё может быть спокойно реализовано на указателях.
Я просто считаю, что ссылка-поле — это очень нехорошая вещь с точки зрения скрытия семантики работы с указателем, а не самой переменной
Ваш пример можно было бы реализовать вообще через класс, который бы сам создавал и открывал соединение
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, puremind, Вы писали:
P>>А можно еще структурные паттерны проектирования вспомнить ...
FDS>Ну... мне нечего вспоминать на этот счёт — не знаю я этого
FDS>Можно ссылочку (на открытый проект) на пример реального кода, где используются ссылки как поля объектов. Или просто привести здесь код, когда вот без это ссылки жизнь становится нехорошей? Просто ну вот не приходит в голову кому и зачем может такое понадобится. Я считаю, что это явный источник трудноуловимых ошибок... буду рад поменять своё мнение, но теперь я, кажется, понимаю, откуда у программистов по статистике 6 ошибок на сто строк... (впрочем, позавчера я тоже сделал 6 ошибок на 100 строк на Nemerle...)
std::auto_ptr
всевозможные scoped lock'и, guard'ы etc.
Здравствуйте, DKM_MSFT, Вы писали:
DKM>Здравствуйте, Sergey, Вы писали:
S>>Зато незнание языка много что значит У меня на собеседовании треть кандитатов уходила после того, как не могли ответить на один из первых вопросов — как проинициализировать ссылку-член класса.
DKM>Это означает лишь то, что благодаря вашим усилиям, компания, вполне вероятно, лишилась многих хороших программистов.
Если таких берут в MS, то понятно, кто пишет ATL
S>>Причем один человек был с шестилетним опытом, работал в крупной компании. Про ссылки не знал ничего. Это ж блин каким любознательным человеком надо быть, чтоб за 6 лет, да...
DKM>Наверное, этот случай должен был убедить вас в том, что вы спрашиваете какую-то ерунду, да?
За 6 лет он обязан был знать это. Может он спец по C With Classes
Здравствуйте, superman, Вы писали:
S>Здравствуйте, FDSC, Вы писали:
FDS>>Здравствуйте, superman, Вы писали:
S>>>Здравствуйте, FDSC, Вы писали:
FDS>>>>Я в шоке... кому и зачем такое может понадобиться?
S>>>а потом возникают вопросы о проблемах с понимением молодых програмистов
FDS>>Я, вообще-то, не C++-программист так что и проблемы возникают не из-за этого
S>Хм.. а к чему тогда вообще этот разговор? что за привычка учить других тому, в чем сам "не в зуб ногой".
А где я сказал, что в я "не в зуб ногой"? Просто вы начали говорить, что я не "в зуб ногой" и оттуда все и проблемы, я вам ответил, что я на C++ никогда проекты, которые использовали больше 4-х человек не писал. Вряд ли я могу называться после этого C++ программистом, но участвовать в обсуждении у меня права никто не отнимал. В конце концов, курс по C++ я сдал на отл. автоматом
S>Я С++ програмист. Я отвечу как проинициализировать член-ссылку класа даже если меня разбудить ночью, хоть и начну свой ответ с нецензурных выражений в адрес разбудившего . Так же расскажу что в этом плохого и хорошего. В прошлом я неоднократно использовал такое в своей работе, соглашусь что это было не самым элегантным, но удовлетворительным и единственным доступным мне тогда решением. Я просто недоумеваю по поводу ваших воплей на тему "потерянных ценных сотрудников". я предполагаю что и среди моих знакомых есть знакомые "С++ програмисты" не способные ответить на подобный вопрос но склонен списывать это на их недоученность а никак не на глупость вопроса.
Я не воплю по поводу потерянных ценных сотрудников, не приписывайте мне слова других.
Я говорю только то, что человек может вполне нормально программировать, но на собеседовании не ответить на этот вопрос, просто из-за излишнего волнения. Был бы у него под рукой компилятор, он бы это сделал за пол минуты, только вот он этого всё равно никогда бы не САМ стал делать. А то, что он САМ не станет делать, ему и не нужно отвечать.
Считаю, что вместо этого вопроса было бы уместно привести код с этой ссылкой и спросить, что делается. Хотя, в принципе, если ищется действительно хороший программист, то, конечно, на вопрос он должен ответить, даже если никогда этого не видел.
А вообще, в ваших словах есть доля правды — соображать-то действительно надо, даже если не использовал
DKM>>Наверное, этот случай должен был убедить вас в том, что вы спрашиваете какую-то ерунду, да?
КЛ>За 6 лет он обязан был знать это. Может он спец по C With Classes
Дык "каким образом" он обязан был это знать? Его что в военкомате этому обучали?
Программировал себе человек, горя не знал, а вы тут ему, "обязан"
FDS>А где я сказал, что в я "не в зуб ногой"? Просто вы начали говорить, что я не "в зуб ногой" и оттуда все и проблемы, я вам ответил, что я на C++ никогда проекты, которые использовали больше 4-х человек не писал. Вряд ли я могу называться после этого C++ программистом, но участвовать в обсуждении у меня права никто не отнимал. В конце концов, курс по C++ я сдал на отл. автоматом
извините, погорячился.
я просто когда слышу фразу "это деталь, за 5 мнут надйду в МСДН" зверею и начинаю "мочить" всех без разбора.
FDS>Я не воплю по поводу потерянных ценных сотрудников, не приписывайте мне слова других. FDS>Я говорю только то, что человек может вполне нормально программировать, но на собеседовании не ответить на этот вопрос, просто из-за излишнего волнения. Был бы у него под рукой компилятор..
Не может!
Студент, сдавший курс по С++ на отлично автоматом может нормально програмировать и быть ценным (а также безценным) сотрудником и без подобных знаний, НО ИМХО Человек с 6-ю годами на С++ на этот вопрос не ответить права не имеет.