Re[8]: что за ....!!! где C++ программисты?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 08:59
Оценка:
Здравствуйте, superman, Вы писали:

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



FDS>>Я в шоке... кому и зачем такое может понадобиться?


S>а потом возникают вопросы о проблемах с понимением молодых програмистов


Я, вообще-то, не C++-программист так что и проблемы возникают не из-за этого
Re[10]: А можно пример РЕАЛЬНОГО кода?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 09:12
Оценка: :)
Здравствуйте, puremind, Вы писали:

P>А можно еще структурные паттерны проектирования вспомнить ...


Ну... мне нечего вспоминать на этот счёт — не знаю я этого


Можно ссылочку (на открытый проект) на пример реального кода, где используются ссылки как поля объектов. Или просто привести здесь код, когда вот без это ссылки жизнь становится нехорошей? Просто ну вот не приходит в голову кому и зачем может такое понадобится. Я считаю, что это явный источник трудноуловимых ошибок... буду рад поменять своё мнение, но теперь я, кажется, понимаю, откуда у программистов по статистике 6 ошибок на сто строк... (впрочем, позавчера я тоже сделал 6 ошибок на 100 строк на Nemerle...)
Re[4]: что за ....!!! где C++ программисты?
От: machine3000  
Дата: 31.05.07 09:18
Оценка: :)
Здравствуйте, LuciferMoscow, Вы писали:

LM>Я сломаю Ваши детские фантазии.


Ох, какой Вы, батенька, садист.
Re[11]: А можно пример РЕАЛЬНОГО кода?
От: sc Россия  
Дата: 31.05.07 09:25
Оценка: 2 (1)
Здравствуйте, FDSC, Вы писали:
<skepped>
FDS>Можно ссылочку (на открытый проект) на пример реального кода, где используются ссылки как поля объектов. Или просто привести здесь код, когда вот без это ссылки жизнь становится нехорошей? Просто ну вот не приходит в голову кому и зачем может такое понадобится.<skippe>

опять не из реального проекта, но идея должна быть понятна:
int somefunc()
{
    struct ConnectGuard
    {
        Connection &c;
        ConnectGuard(Connection &c): c(c){}
        ~ConnectGuard(){ c.Close(); }
    }

    Connection c;
    if(c.Open(...))
    {
        ConnectGuard(c);
        ....
        if(...)
             return -1;
        ....
        if( ....)
             return -1;
        ....
    }
}


В общем RAII. Не нужно закрывать соединение, оно само закроется.
А также файлы, хэндлы и прочая может быть автомат. освобождены/деинициализированы и т.д.)
Re[9]: что за ....!!! где C++ программисты?
От: superman  
Дата: 31.05.07 09:30
Оценка: +2 :)
Здравствуйте, FDSC, Вы писали:

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


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



FDS>>>Я в шоке... кому и зачем такое может понадобиться?


S>>а потом возникают вопросы о проблемах с понимением молодых програмистов


FDS>Я, вообще-то, не C++-программист так что и проблемы возникают не из-за этого


Хм.. а к чему тогда вообще этот разговор? что за привычка учить других тому, в чем сам "не в зуб ногой".
Я С++ програмист. Я отвечу как проинициализировать член-ссылку класа даже если меня разбудить ночью, хоть и начну свой ответ с нецензурных выражений в адрес разбудившего . Так же расскажу что в этом плохого и хорошего. В прошлом я неоднократно использовал такое в своей работе, соглашусь что это было не самым элегантным, но удовлетворительным и единственным доступным мне тогда решением. Я просто недоумеваю по поводу ваших воплей на тему "потерянных ценных сотрудников". я предполагаю что и среди моих знакомых есть знакомые "С++ програмисты" не способные ответить на подобный вопрос но склонен списывать это на их недоученность а никак не на глупость вопроса.
Re[6]: что за ....!!! где C++ программисты?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 09:45
Оценка: +1
Здравствуйте, 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>А это уже реальный косяк! .. =)


Ну дак вы же после ссылки уже отправите, до констант даже не дойдёт...
Re[12]: что за ....!!! где C++ программисты?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 09:46
Оценка:
Здравствуйте, 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;
}
Re[6]: что за ....!!! где C++ программисты?
От: superman  
Дата: 31.05.07 09:49
Оценка: 6 (2) :))
Здравствуйте, pavel_turbin, Вы писали:


_>

_>struct ABC
_>{
_>     int &a;
_>};

_>


_>может ли существовать такой тип 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 хм.. надо будет подумать как обрабатывать эту ситуёвину
    }
}


а средства языка ИМХО знать надо.
Re[12]: А можно пример РЕАЛЬНОГО кода?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 09:53
Оценка:
Здравствуйте, sc, Вы писали:

sc>В общем RAII. Не нужно закрывать соединение, оно само закроется.

sc>А также файлы, хэндлы и прочая может быть автомат. освобождены/деинициализированы и т.д.)

Что мешает конструктор Connection вынести прямо в структуру?
Что мешает передать структуре указатель, а не ссылку?

Я не против того, что ссылка может потребоваться, но когда вместо неё нельзя использовать указатель, или можно, но очень неудобно? Я просто не понимаю, почему человек удивляется, что после 6 лет работы программист этого в глаза не видел. Всё может быть спокойно реализовано на указателях.

Я просто считаю, что ссылка-поле — это очень нехорошая вещь с точки зрения скрытия семантики работы с указателем, а не самой переменной
Ваш пример можно было бы реализовать вообще через класс, который бы сам создавал и открывал соединение
Re[11]: А можно пример РЕАЛЬНОГО кода?
От: Константин Л. Франция  
Дата: 31.05.07 09:55
Оценка: 1 (1)
Здравствуйте, FDSC, Вы писали:

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


P>>А можно еще структурные паттерны проектирования вспомнить ...


FDS>Ну... мне нечего вспоминать на этот счёт — не знаю я этого



FDS>Можно ссылочку (на открытый проект) на пример реального кода, где используются ссылки как поля объектов. Или просто привести здесь код, когда вот без это ссылки жизнь становится нехорошей? Просто ну вот не приходит в голову кому и зачем может такое понадобится. Я считаю, что это явный источник трудноуловимых ошибок... буду рад поменять своё мнение, но теперь я, кажется, понимаю, откуда у программистов по статистике 6 ошибок на сто строк... (впрочем, позавчера я тоже сделал 6 ошибок на 100 строк на Nemerle...)


std::auto_ptr
всевозможные scoped lock'и, guard'ы etc.
Re[12]: А можно пример РЕАЛЬНОГО кода?
От: dev1024  
Дата: 31.05.07 09:57
Оценка: +1 -1
Здравствуйте, sc, Вы писали:

sc>
sc>int somefunc()
sc>{
sc>    struct ConnectGuard
sc>    {
sc>        Connection &c;
sc>        ConnectGuard(Connection &c): c(c){}
sc>        ~ConnectGuard(){ c.Close(); }
sc>    }

sc>    Connection c;
sc>    if(c.Open(...))
sc>    {
sc>        ConnectGuard(c);
sc>        ....
sc>        if(...)
sc>             return -1;
sc>        ....
sc>        if( ....)
sc>             return -1;
sc>        ....
sc>    }
sc>}


sc>В общем RAII. Не нужно закрывать соединение, оно само закроется.


Причём ещё до начала работы с ним.
Re[13]: А можно пример РЕАЛЬНОГО кода?
От: superman  
Дата: 31.05.07 10:01
Оценка:
Здравствуйте, FDSC, Вы писали:


FDS>Я просто считаю, что ссылка-поле — это очень нехорошая вещь с точки зрения скрытия семантики работы с указателем, а не самой переменной


ИМХО, это не самый большой недостаток подобного подхода, если вообще недосток.
Re[5]: что за ....!!! где C++ программисты?
От: Константин Л. Франция  
Дата: 31.05.07 10:04
Оценка:
Здравствуйте, DKM_MSFT, Вы писали:

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


S>>Зато незнание языка много что значит У меня на собеседовании треть кандитатов уходила после того, как не могли ответить на один из первых вопросов — как проинициализировать ссылку-член класса.


DKM>Это означает лишь то, что благодаря вашим усилиям, компания, вполне вероятно, лишилась многих хороших программистов.


Если таких берут в MS, то понятно, кто пишет ATL

S>>Причем один человек был с шестилетним опытом, работал в крупной компании. Про ссылки не знал ничего. Это ж блин каким любознательным человеком надо быть, чтоб за 6 лет, да...


DKM>Наверное, этот случай должен был убедить вас в том, что вы спрашиваете какую-то ерунду, да?


За 6 лет он обязан был знать это. Может он спец по C With Classes

[]
Re[10]: что за ....!!! где C++ программисты?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 10:04
Оценка:
Здравствуйте, superman, Вы писали:

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


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


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



FDS>>>>Я в шоке... кому и зачем такое может понадобиться?


S>>>а потом возникают вопросы о проблемах с понимением молодых програмистов


FDS>>Я, вообще-то, не C++-программист так что и проблемы возникают не из-за этого


S>Хм.. а к чему тогда вообще этот разговор? что за привычка учить других тому, в чем сам "не в зуб ногой".


А где я сказал, что в я "не в зуб ногой"? Просто вы начали говорить, что я не "в зуб ногой" и оттуда все и проблемы, я вам ответил, что я на C++ никогда проекты, которые использовали больше 4-х человек не писал. Вряд ли я могу называться после этого C++ программистом, но участвовать в обсуждении у меня права никто не отнимал. В конце концов, курс по C++ я сдал на отл. автоматом

S>Я С++ програмист. Я отвечу как проинициализировать член-ссылку класа даже если меня разбудить ночью, хоть и начну свой ответ с нецензурных выражений в адрес разбудившего . Так же расскажу что в этом плохого и хорошего. В прошлом я неоднократно использовал такое в своей работе, соглашусь что это было не самым элегантным, но удовлетворительным и единственным доступным мне тогда решением. Я просто недоумеваю по поводу ваших воплей на тему "потерянных ценных сотрудников". я предполагаю что и среди моих знакомых есть знакомые "С++ програмисты" не способные ответить на подобный вопрос но склонен списывать это на их недоученность а никак не на глупость вопроса.


Я не воплю по поводу потерянных ценных сотрудников, не приписывайте мне слова других.
Я говорю только то, что человек может вполне нормально программировать, но на собеседовании не ответить на этот вопрос, просто из-за излишнего волнения. Был бы у него под рукой компилятор, он бы это сделал за пол минуты, только вот он этого всё равно никогда бы не САМ стал делать. А то, что он САМ не станет делать, ему и не нужно отвечать.

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


А вообще, в ваших словах есть доля правды — соображать-то действительно надо, даже если не использовал
Re[6]: что за ....!!! где C++ программисты?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 10:08
Оценка:
Здравствуйте, pavel_turbin, Вы писали:

_>
_>struct ABC
_>{
_>     int &a;
_>};
_>


Ну дак это совсем другой вопрос. Тут код уже дан. Понимаете разницу?
Вот этот вопрос, пожалуй, очень хороший
Re[13]: Специально для superman
От: dev1024  
Дата: 31.05.07 10:10
Оценка: :)
Внимательно посмотри на строчку

        ConnectGuard(c);
Re[6]: что за ....!!! где C++ программисты?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 10:13
Оценка:
Здравствуйте, Константин Л., Вы писали:


DKM>>Наверное, этот случай должен был убедить вас в том, что вы спрашиваете какую-то ерунду, да?


КЛ>За 6 лет он обязан был знать это. Может он спец по C With Classes


Дык "каким образом" он обязан был это знать? Его что в военкомате этому обучали?
Программировал себе человек, горя не знал, а вы тут ему, "обязан"
Re[6]: что за ....!!! где C++ программисты?
От: FDSC Россия consp11.github.io блог
Дата: 31.05.07 10:15
Оценка:
Здравствуйте, pavel_turbin, Вы писали:

_>может ли существовать такой тип ABC, вообще? Если программист "с лету" говорит "Да, проблем нет."


А если он ответит, что это невозможно? Что вы будете делать?
Re[12]: А можно пример РЕАЛЬНОГО кода?
От: 0x8000FFFF Россия  
Дата: 31.05.07 10:18
Оценка: 8 (1)
std::auto_ptr — не использует ссылки как поля объектов — там указатели.
Re[11]: что за ....!!! где C++ программисты?
От: superman  
Дата: 31.05.07 10:20
Оценка: 1 (1) +1
Здравствуйте, FDSC, Вы писали:


FDS>А где я сказал, что в я "не в зуб ногой"? Просто вы начали говорить, что я не "в зуб ногой" и оттуда все и проблемы, я вам ответил, что я на C++ никогда проекты, которые использовали больше 4-х человек не писал. Вряд ли я могу называться после этого C++ программистом, но участвовать в обсуждении у меня права никто не отнимал. В конце концов, курс по C++ я сдал на отл. автоматом


извините, погорячился.
я просто когда слышу фразу "это деталь, за 5 мнут надйду в МСДН" зверею и начинаю "мочить" всех без разбора.

FDS>Я не воплю по поводу потерянных ценных сотрудников, не приписывайте мне слова других.

FDS>Я говорю только то, что человек может вполне нормально программировать, но на собеседовании не ответить на этот вопрос, просто из-за излишнего волнения. Был бы у него под рукой компилятор..

Не может!
Студент, сдавший курс по С++ на отлично автоматом может нормально програмировать и быть ценным (а также безценным) сотрудником и без подобных знаний, НО ИМХО Человек с 6-ю годами на С++ на этот вопрос не ответить права не имеет.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.