Здравствуйте, Hottabych1, Вы писали:
H>Все эти базовые вещи проходятся в ВУЗе на первом курсе или в школе в 10м классе, потом за ненадобностью благополучно забываются. Не забудутся только если их использовать в работе, а на работу не возьмут, если ты их не использовал.
Э-э-э...
Ну что я могу сказать...
Если ты работал программистом на С++ и при этом у тебя const забылся "за ненадобностью", потому что "ты их не использовал" — я бы тебя не взял на работу хотя бы потому, что твой предыдущий опыт работы развил в тебе плохие привычки программирования, с которыми мне же потом и придется сражаться. В этом плане действительно лучше брать зеленых выпускников, которые еще не успели набраться всякой дряни, и выращивать из них нормальных программистов. Но это при условии что на рынке нет профессионалов, что в России далеко не так.
H>Если человек еще студент, но с желанием учиться и развиваться дальше, то следует ему в этом помочь — в конце концов это инвестиция фирмы.
Поставь себя на место владельца фирмы и подумай, в кого выгоднее инвестировать — в новичка или в профессионала.
H>Или, может, Вы родились, уже зная Си++ и STL?
Конечно же, нет. Я работал на part-time за $350 в месяц. И ни в какие конторы уровня Яндекса или Google не лез. Потому что отлично осознавал свой тогдашний уровень.
P.S. Ты зря упорствуешь и ставишь форум на уши. Ничего страшного не произошло. Тебе указали на конкретные пробелы в твоих знаниях — закрывай их. В конце концов, твоя цель ведь — стать высокооплачиваемым профессионалом, а не просто числиться в Яндексе. Я знаю нескольких человек, которым было отказано на собеседованиях в те фирмы, в которые они мечтали устроиться, но они не пошли плакаться на форум, а пошли учиться, и сейчас они повторные интервью в те же самые конторы проходят без напрягов.
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, minorlogic, Вы писали:
M>>>Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
J>>подходит, если ты свой общий случай будешь хранить не по значению, а по указателю J>>swap указателей — операция безболезненная
M>В общем случае нам придется свести все к частному случаю без обид .. звучит прикольно.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, jazzer, Вы писали:
M>>>Ну наконецто вы озвучили то что я пытался сказать , для применения описанного трюка , все участвующие классы должны нести соответствующую нагрузку. И данный трюк не подходит для general случая.
J>>подходит, если ты свой общий случай будешь хранить не по значению, а по указателю J>>swap указателей — операция безболезненная
КД>При монопольном доступе к обоим указателям
КД>Бугагага
Здравствуйте, Hottabych1, Вы писали:
H>Все эти базовые вещи проходятся в ВУЗе на первом курсе или в школе в 10м классе, потом за ненадобностью благополучно забываются. Не забудутся только если их использовать в работе, а на работу не возьмут, если ты их не использовал.
Хотабыч открыл Америку!
H>Если человек еще студент, но с желанием учиться и развиваться дальше, то следует ему в этом помочь — в конце концов это инвестиция фирмы.
Лучшие инвестиции это те, которые ты сам для себя сделал
А, типа, "господа, вкладывайте в меня бабки и я стану умным ... ну и так далее" — это убого.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, jazzer, Вы писали:
J>>>swap указателей — операция безболезненная
КД>>При монопольном доступе к обоим указателям
КД>>Бугагага
J>сорри, не понял, расшифруй свою мысль
Ну я в контексте мысли "что может свалить то, что свалить нельзя".
Если (тупой) объект используется в разных потоках, то вполне можем переместить недействительный указатель.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Если (тупой) объект используется в разных потоках, то вполне можем переместить недействительный указатель.
Ну это к swap прямого отношения не имеет.
Ты ту же самую проблему получишь, используя pimpl
Здравствуйте, Hottabych1, Вы писали:
H>Все эти базовые вещи проходятся в ВУЗе на первом курсе или в школе в 10м классе, потом за ненадобностью благополучно забываются. Не забудутся только если их использовать в работе, а на работу не возьмут, если ты их не использовал.
Вот я действующий студент, уже полтора года работаю. Работаю я в местной конторе, а т.к. в городе плохо с кадрами, то берут кого угодно, ну разве что не берут совсем тупых. Вот почему бы тебе не пойти туда, где проще, приобрести опыт и попробовать устроиться туда, куда ты хотел бы. Что ж ты раньше то не думал?
Да и работа — штука относительная. Я вот когда пришёл на собеседование, уже представлял себе, что такое const в C++, хотя мне это было не надо, т.к. пишем всё на C#. А всё потому, что до этого я сам мучил C++. Книжки читал, понимал, зачем нужна эта концепция и т.д. Ведь если ты понимаешь, зачем вообще в C++ был введён const, то ты вряд ли забудешь, как он используется. Потом ещё для себя задачки интересные придумывал, реализовывал.
Кстати, небольшой оффтоп — сейчас пишу на C# и тяжело приходится без const — приходится явно писать интерфейс вида IConstXXX и наследовать от него IXXX. Хотя, const тоже пораждает немало граблей. Так что, может оно и к лучшему.
H>Если человек еще студент, но с желанием учиться и развиваться дальше, то следует ему в этом помочь — в конце концов это инвестиция фирмы. Или, может, Вы родились, уже зная Си++ и STL?
Если у человека действительно есть желание учиться и развиваться, он возьмёт и будет развиваться. И не надо уповать на злых дядек, которые тебе в этом мешают.
Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Здравствуйте, Hottabych1, Вы писали:
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Речь не о синтаксисе/конструкциях, а об идеологии, идеях и идиомах.
Т.е. если бы ты не стал писать, а сказал словами: "конструтор копирования принимает константную ссылку на А" — вряд ли стали бы обязательно проверять, можешь ли ты это записать без ошибок на бумаге, по крайней мере, вес неправильно записанного был бы намного ниже.
А если человек не знаком с идиомами и общими приемами — он еще не профессионал, ему еще стоит подучиться, вот и все.
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Я вообще не понимаю, как это — верен в индустрии???
У компании есть необходимость в специалисте, она сама по собственному усмотрению
устраивает собеседования и решает подходит он ей или нет. И пофиг этой компании как
вся остальная индустрия решает этот вобщем-то интимный вопрос.
Здравствуйте, Hottabych1, Вы писали:
H> Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
О боже.. в последний раз Ответ:
ИМХО Для того что бы заниматься профессиональным програмированием на С++ необходимо знать что такое конструктор копирования, какова его сигнатура и понимать почему у него константный параметр! Это необходимое условие, но никак не достаточное . Это знать необходимо. Все возможные исключения либо специфика кадровой политики данной конкретной компании, либо исключения подтверждающие правило.
Здравствуйте, Hottabych1, Вы писали:
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка. И совершенно при этом не снимаю с себя ответственности за убитое интервью. Потому что в каждой компании есть те или иные требования к кандидатам формального характера. Меня лишь интересует, насколько верен такой подход вообще, в целом, во всей индустрии. И какой способ отбора кандидатов является наиболее объективным. Все эти консты и конструкторы копирования лишь частности.
Вот читаю форум и не совсем понимаю. На собеседованиях проверяют знания. Разные. Например, на яндексе проверяют как человек реально знает C++. В MS проверяют (из языка) главным образом только алгоритмы и те простые (правда заставляют писать на бумажке, что сложнее).
Что конкретно ты знаешь? С++ — вроде нет пока. Алгоритмы — вроде тоже нет. Как ты хочешь, чтобы работодатель предпочел тебя другим? По каким параметрам? Что светлая голова — имхо не понимаю — это же тоже нужно как-то доказать. Например я прежде чем пойти устраиваться в первую контору проштудировал страуструпа, сдал brainbench > 4.6. Пописал собственные проекты. И примерно представлял (хоть как-то) что такое конструктор копирования, зачем нужен const и т.д. И могу сказать, что это не совсем 10 сек посмотрел и уже понял. Некоторые темы приходилось прорубать...
И вот уже >6 лет постоянно читаю книжки, изучаю алгоритмы и постоянно в C++(!) открываю все новые и новые возможности и более чем уверен, что их еще ну просто очень много. Я уж не говорю, что boost просто не смотрел (все равно начальство не даст добро ).
Здравствуйте, Hottabych1, Вы писали:
H>Я никого ни в чем не обвиняю. Изначально просто интересовало мнение публики, насколько, по вашему мнению, важно знание именно синтаксиса языка Си++, конструкций языка.
Еще раз повторяю: нет не нужно. тебя не взяли не за это.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
КД>>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
M>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер.
M>Для тривиальных , небиблиотечных классов — это дурной тон.
Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель).
И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит.
А если у тебя там будет ссылка, а не указатель — так у тебя по умолчанию ничего и не сгенерится даже — сразу будет ошибка компиляции при попытке вызова.
Это в небиблиотечном коде сплошь и рядом и вполне тривиально.
J>Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель). J>И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит.
Другой вопрос — часто ли это нужно в обычной жизни? Вот мне в классе Foo нужен указатель X с семантикой владения. Допустим он владеет целой пачкой объектов типа Y:
class Foo
{
std::vector<Y> X;
};
Нужно этому классу написать конструктор копирования? Или оператор присваивания? Или пусть компилятор сгенерит?
Мой совет: забудьте про конструкторы копирования и операторы присваивания, изучите умные указатели из стандартной библиотеки и буста (если не хватает — допишите еще парочку специфичных для вас). Жизнь облегчает значительно.
Здравствуйте, sraider, Вы писали:
J>>Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель). J>>И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит.
S>Другой вопрос — часто ли это нужно в обычной жизни? Вот мне в классе Foo нужен указатель X с семантикой владения. Допустим он владеет целой пачкой объектов типа Y:
S>
class Foo
S>{
S> std::vector<Y> X;
S>};
И где указатель? Здесь владение по значению. А я говорил об указателе. Да и ты тоже, вроде, поначалу.
S>Нужно этому классу написать конструктор копирования? Или оператор присваивания? Или пусть компилятор сгенерит?
Этому — не нужно. Нехай генерит
S>Мой совет: забудьте про конструкторы копирования и операторы присваивания, изучите умные указатели из стандартной библиотеки и буста (если не хватает — допишите еще парочку специфичных для вас). Жизнь облегчает значительно.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, minorlogic, Вы писали:
КД>>>
КД>>>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
M>>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер.
M>>Для тривиальных , небиблиотечных классов — это дурной тон.
J>Достаточно просто положить в класс ссылочный член с семантикой владения (например, указатель). J>И придется писать конструкторы и операторы, никуда не денешься — генерящийся по умолчанию тебя не устроит. J>А если у тебя там будет ссылка, а не указатель — так у тебя по умолчанию ничего и не сгенерится даже — сразу будет ошибка компиляции при попытке вызова.
J>Это в небиблиотечном коде сплошь и рядом и вполне тривиально.
Не знаю что есть "ссылочный член с семантикой владения " , но про указатель я писал , достаточно умный указатель использовать.
Если же вы предролагаете копировать и данные по указателю , тогда возникает вопрос , а почему там указатель а не агрегированный мембер ?
J>И где указатель? Здесь владение по значению. А я говорил об указателе. Да и ты тоже, вроде, поначалу.
X — это и есть тот самый [умный] указатель. Указывает на массив объектов, хранящихся где-то (например, на куче). И при копировании он сам копирует объекты, которыми он владеет. На то он и умный.
PS. Я полагаю тебе не нужно объяснять, что std::vector<> из себя представляет внутри ;)
Здравствуйте, jazzer, Вы писали:
H>>Или, может, Вы родились, уже зная Си++ и STL? J>Конечно же, нет. Я работал на part-time за $350 в месяц. И ни в какие конторы уровня Яндекса или Google не лез. Потому что отлично осознавал свой тогдашний уровень.
Буржуин! Я с 200 начинал
struct BaseClass {...} // все сплошь абстрактное и виртульноеstruct DerivedClass1 : BaseClass {...}
struct DerivedClass2 : BaseClass {...}
struct DerivedClass3 : BaseClass {...}
BaseClass* CoolFactory(....); // Фабрикаclass A
{
BaseClass* p;
public:
A(BaseClass* b) : p(b) {}
~A() { delete p; }
};
int main(argc, argv)
{
A a1( CoolFactory(argc, argv) );
A a2(a1);
}
Даже если ты заменишь голый указатель на любой умный по твоему выбору, избавившись от деструктора — тебе все равно придется что-то делать с копированием и присваиванием (напоминаю, нам нужна семантика владения и, соответственно, глубокого копирования).
Конечно, можно и тут навертеть чего-нть, нагенерить traits и специальных классов, которые будут умными указателями и при этом будут уметь с этими traits работать, но это уже будет совершенно нетривиально.
Например, BaseClass может предоставлять операцию clone, тогда копирование будет просто:
A::A(const A& rhs)
{
p = rhs.p->clone();
}
Или же он может предоставлять еще какую-нть информацию, которой может воспользоватсья фабрика, тогда код будет такой:
A::A(const A& rhs)
{
p = CoolFactory( rhs.p->get_info_for_copy_making() );
}
Или же он может отдавать другой объект-прототип, из которого он сам был создан:
A::A(const A& rhs)
{
p = rhs.p->get_prototype()->make_new_clone();
}
Или же вообще будет специальная функция копирования а ля strcpy:
A::A(const A& rhs)
{
base_class_cpy(p, rhs.p);
}
Иными словами, тебе в любом случае придется писать явно копирование и присваивание, просто ты это можешь сделать на разных уровнях — либо в классе A, либо создавая еще один уровень косвенности и реализуя явно присваивание и копирование для этих промежуточных классов.