![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Хотелось бы услышать почему так:
1)Конструктор класса не может быть виртуальным 2)Деструктор – может (и должен!!) ![]() --------------------
|
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 3 Всего: 36 |
1. потому что в языке с++ должен быть известен тип конструируемого объекта
2. потому что стандарт разрешает виртуальные деструкторы. то, что далее в скобках - неправда. |
|||
|
||||
maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
А если поглубже закопаться, что там будет?
--------------------
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Этот вопрос будет в числе вопросов на высокую оценку, вот и хочется узнать по подробнее что бы дать более конкретный ответ, и обаснованный.
--------------------
|
|||
|
||||
NightmareZ |
|
||||
![]() [хакер] ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 10.8.2006 Репутация: 0 Всего: 13 |
А зачем ему быть виртуальным? Такой вот код выведет "A":
а такой выведет "BA":
Пояснения нужны? -------------------- NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш Ely-Art.ru - наша маленькая домашняя арт-студия mugcraft.ru - кружки на любой вкус |
||||
|
|||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 3 Всего: 36 |
maxi91m,
А если поглубже закопаться, что там будет? не знаю, я не закапывался. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Можно сделать так, что конструктор станет вируальным. Хотя виртуальные конструкторы и не поддерживается напрямую в С++, но используя хитрости и уловки этого не так уж сложно добиться. Если вам интересно - я приведу пример из книжки. |
|||
|
||||
maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Если можно, скажите название книги и автора. --------------------
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Программирование на С++. Дж.Коплиен. |
|||
|
||||
ISergeyN |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: 2 Всего: 2 |
||||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
это код из учебной книжки или собственные эксперементы ?! ![]()
плохая привычка полагаться на порядок членов.
а не лучше внутренниe махинации отдать копи-конструктору, и в copy оставить лишь return new Oper(this); ? ... P.S. имхо также для для подобной идеологии лучше подходит имя clone, чем copy. |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Из книжки. "Программирование на С++". Дж.Коплиен. Она всем классная, но немножко старая. 1992 года. На русский её перевели только в 2005 году, супер, да? ![]() Поэтому и стиль программирования отличается от теперешнего.
лучше. но я решил не лезть своим пятачком в учебный код. Это сообщение отредактировал(а) zim22 - 16.5.2009, 20:33 |
|||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
Если поможет.
Конструктор делать виртуальным нет смысла т.к. при создании объекта прямо указывается его тип и никаких вариантов быть не может. Деструктор делается виртуальным т.к. при использовании указателя на суперкласс(родитель) для использования некоторого созданного объекта, его удаление через этот указатель приведет к неправильному удалению исходного объекта т.к. будет удалена лишь часть, касающаяся суперкласса. Таким образом использование виртуального деструктора необходимо для использования как написано выше, а в случае использования непосредственно созданного объекта или указателя на него тогоже типа что и объект его использование не обязательно. |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
Я думаю, что есть такой предел в написании кода, после которого лишь некоторые способны до конца понять как это работает. ИМХО переступая за него человек (программист) как бы обрекает себя на "одиночество", что не хорошо для кода самой программы т.к. если его будет поддерживать человек, который не очень разбирается в его работе, возможны варианты трудно отлавливаемых ошибок, что делает данный процесс (поддержания , развития) дорогим (время, деньги). Может я не прав конечно, но мне как-то удавалось без виртуальных конструкторов создавать нормальный код и что более важно я даже не задумывался о необходимости мыслей типа "создания объекта, тип которого не известен". ИМХО код должен быть понятен программисту (ИМХО не только создавшему его), прост ("но не проще" не помню откуда цитата), отвечать требованиям.
Повторюсь, что это все лично мое "ИМХО" - кто-то согласится, кто-то нет. Я, читая книги со всякими примерами из рода "вывернем С++ на изнанку", считаю, что они достаточно полезны, но применять все это надо с осторожностью и полной уверенностью, что это необходимо ( в моих 99% случаях это все лишнее ). В вопросу о выборе типа объекта н аэтапе выполнения. Как-то фабрики объектов и интерфейсные классы достаточно функциональны в этом плане. Это сообщение отредактировал(а) fry - 17.5.2009, 17:13 |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Некоторые - это кто? одаренные гении? Это проблема лично того программиста который не понимает. Он может и С++ не знать, никто не обязан писать для него комментарии типа
Design Pattern должен быть понятным и читабельным для любого программиста среднего уровня, а виртуальный конструктор - самый настоящий шаблон проектирования. |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
||||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
Я СЕЙЧАС говорю не о "Hello World!", принцип его работы не надо комментировать для нормального программита. По вашему (azesmcar) каждый программист (если он даже гений) должен писать код с применением всех самых сложных конструкций и способов программирования которые он вычитал? Если все будут читать книги Александреску и других (что само по себе не плохо) и писать весь свой код по ним, то сколько по вашему мнению будет людей, которые смогут обслуживать код и выдавать реальный результат на выходе, какие деньги придется платить тем, кто это может, сколько надо потратить времени и денег для приведения их к данному уровню культуры/методов программирования? Я писал именно об этом. Если этого мало, то как по вашему: Сложность кода коррелирует с количеством ошибок? Сколько может стоить ошибка в простом и в сложном коде? Всегда ли сложный код, пусть даже он и работает быстрее и по вашему "ИМХО" лучше, так необходим для реализации проекта? Lazin, с тобой согласен на 100% Это сообщение отредактировал(а) fry - 17.5.2009, 17:57 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Нет, код надо писать с применением тех конструкций, которые самым лучшим образом решат поставленную задачу. Если это виртуальный конструктор - пусть это будет он. А писать то что не решает задачу лучшим образом только потому что программист который в будущем будет сопровождать этот код недостаточно компетентен чтобы понять работу виртуальных функций - вот этого точно не стоит делать. ![]() Возможно чтобы написать что-то наподобие и нужно прочитать некоторые книги, но чтобы понять написанное - простых знаний С++ вполне достаточно. Там нет ничего сверхестественного, обычные конструкции C++. Это сообщение отредактировал(а) azesmcar - 17.5.2009, 18:02 |
|||
|
||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
Хочу добавить, что я не против таких конструкций, я за применение их только ести это необходимо.
Также я за то, что гениальный программист должен подумать прежде чем писать свой гениальный код для обычных смертных. Конечно есть основополагающие конструкции типа паттернов. Их НЕОБХОДИМО знать т.к. писать код на уровне 10 класса школы - это тоже крайность. Все пишется из основных операторов с применением стандартного синтаксиса, на то он и язык. Интересно также кто как будет решать компетентен ли программист или нет. ИМХО субъективное мнение. Я говорю не про бездарей, а про среднего программиста и программиста "гения" ( безграничного любителя книг если хотите ). Если из моего текста это не очень понятно - извеняюсь, однако имелось ввиду именно это. Первый пост писался для "Форум -> Программирование -> C/C++: Для новичков -> Конструкторы и virtual?" Остальные ИМХО в нее не укладываются. Это сообщение отредактировал(а) fry - 17.5.2009, 18:15 |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а как по вашему В каком коде легче сделать ошибку, в простом но придуманном вами или в сложном но 1000 раз продуманном и испробованном годами и специалистами коде?
Смотря в каком проекте, смотря в какой код. Вообще я против написания сложного кода, но повторяюсь..в шаблонах проектирования ничего сложного нет ![]() |
||||
|
|||||
fry |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
Вообще я против написания сложного кода - я этого и ждал
![]() Простой код потенциально не так подвержен ошибкам как сложный. В коде, который был продуман до мелочей также могут возникать ошибки, однако исправлять их легче в простом коде и ума надо меньше, а он нынче дорог (если хороший). думаю продолжать не буду. 1000 раз продуманном и испробованном годами и специалистами коде - это о библиотеках? Это сообщение отредактировал(а) fry - 17.5.2009, 18:22 |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Для кого-то может быть сложным кодом вот это
лишь потому что он не знает что такое template. Прикажете не использовать шаблоны? под сложным кодом я понимаю нечто другое, а не использование конструкций и возможностей языка программирования.
нет, я о шаблонах проектирования (design patterns). У меня есть проект в котором я typelist из книги Александреску использовал, немного подправил под свои нужды и получил мощную вещь избавляющую меня от надобности писать килобайты кода. Так что, мне его убрать только потому что кто-то мог не прочитать эту книгу или просто напросо не иметь понятия о метапрограммировании? Нет уж, спасибо, мне мои нервы дороже. А теперь попробуйте угадать с какого этажа мне наплевать на то что кто-то не сможет понять написанного мною (кстати грамотного) кода? ![]() Это сообщение отредактировал(а) azesmcar - 17.5.2009, 19:07 |
||||
|
|||||
fry |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
Тема превращается в спор.
Я сомниваюсь, что вы поняли о чем я. Могу перефразировать: Лично Вы где потенциально допустите больше ошибок в простом или в сложном коде. Повторюсь насчет вашего примера:
Шаблоны проектирования лишь описание варианта создания некоторого поведения для решения конкретной задачи. Это не код, это принцип, его не проверяют, его используют или не используют.
Если писать код исключительно для себя, то я с вами согласен, однако работая в команде надо думать не только о себе и о неквалифицированности других, иначе все придется делать самому. Это примерно тоже, что и футбол: если один футболист играет лучше других, то не следует выгонять из команды всех "неквалифицированных" футболистов т.к. один, пусть и хороший, футболист явно не потянет игру со слаженной и группой, пусть и не таких квалифицированных. футболистов. Прости за отвлечение. Думаю что ценнее слаженность работы, чем отличительно более высокая квалификация отдельного программиста, т.к. этот программист будет писать "для себя" и остальным в комманде нечем будет заняться кроме разбора "гениального" кода. Т.е. смысл в том, чтобы все работали слаженно. ЗЫ Так можно договориться до того, что в команде каждый должен собюдать свой вариант форматирования кода т.к. ему наплевать, что кто-то привык к установленному среди остальных варианту оформления и внести эту тему в "религиозные войны". |
||||||||||
|
|||||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
У меня на прошлой работы было 25 программистов из которых только двое знали что такое шаблоны. Полный офис бездарей - но писали вроде. Никто не жаловался. каждый шаблон проектирования уже имеет реализацию на C++. Посмотрите к примеру книгу Андрея Александреску - Современное проектирование на C++ - там описан синглтон Майерса, потом описаны проблемы которые в некоторых случая могут возникнуть при его использовании, потом описаны методы решения этих проблем..и так далее. Это для примера, есть шаблон проектирования - синглтон, он нем много сказано, написано итд...мы уже знаем методы его реализации и практически все проблемы которые мы можем иметь при его использовании. Это можно сказать - проверенное средство. стадо бизонов бежит со скоростью самого медленного бизона. Когда на стадо охотятся хищники, первыми умирают последние - самые медленные и слабые особи. Таким образом, натуральный отбор помогает стаду, потому что стадо в целом становится быстрее и выносливее после отсева слабых его членов. Научный факт ![]() Это сообщение отредактировал(а) azesmcar - 17.5.2009, 20:30 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
свет клином не сошелся на этой книге и паттерны, которые там описаны - это база ![]() иногда, люди, прочитавшие эту книгу начинают применять антипаттерн "золотой молоток", тоесть видеть паттерны там, где им не место... думаю именно об этом и говорит fry, многие программы не нуждаются в квалифицированых специалистах и пишутся студентами по случаю... Я считаю, что программы должны писать компетентыне программисты, которых не удивить сложно-извращенными оборотами языка С++ ![]() ![]() |
|||
|
||||
fry |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
В придераетесь к словам, которые являются лишь коментариями к предыдущим вопросам. Отписав несколько постов вы так и не ответили на вопрос:
Говоря о паттернах и имея ввиду их реализацию так и говорите. У меня в книге, например, все паттерны наряду с кодом имеется и графическое представление имхо основное в понимании концепции. Таким образом делаем вывод, что ваш ответ на
является в некоторой степенью не соответствующем теме. Вы сами сказали о его реализации, так вот о процессе реализации (и потенциальных ошибках) и был разговор, а не о том, что хорошо продуманные паттерны (как принцип) - есть залог безошибочного кодирования, что подчеркивается предыдущим вопросом, заданным несколько постов назад.
Вы проверили мой подход? Результатом выявления реальной эффективности того или иного подхода можно проверить лишь при сравнении. Также насчет "бездарей". Я в 10 раз повторяю: мои слова не относятся к ним. Если проще: я говорил о "гениальности" в сравнении со средним рограммистом умеющем писать/читать код на шаблонах, классах, возможно некоторых паттернах и ничего не знающих о typelis'ах. Не пытайтесь найти в моих постах крайностей, попытайтесь вникнуть в суть. Бесконечно благодарен за внимание. На счет жесткой позиции применять паттерны или нет. Естесссно применять, но только там, где это реально нужно, а не везде пихать верхушки "извращений" (в хорошем смысле; не лови меня на этом слове) чтобы народ восхищался этим творением так прекрасно выглядешем и работающем, но для них не понятным. И когда этот человек уходит из коллектива народ судорожно начинает вникать в работу кода чтобы подправить некоторые моменты. Lazin, спасибо, надеюсь твое разъяснение будет более доходчиво. Полностью поддерживаю. Это сообщение отредактировал(а) fry - 17.5.2009, 21:37 |
||||||
|
|||||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Скажем так - прочитавшие - но не понявшие ее предназначение ![]()
знакомая ситуация ![]() до боли знакомая...приходилось видеть
так об этом я не спорю. но я тоже считаю
|
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
не следует забывать, что паттерны(и вообще OOP/OOD) служат для упрощения кода, а не для его усложнения
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Я думал что ответил на этот вопрос. Смотря что вы считаете сложным кодом, если считать сложным кодом. Если это сложный алгоритм то разумеется в сложном алгоритме. А сам код - сложным не бывает если он написан грамотно. Код бывает либо понятен, либо нет. Грамотно написанный код, должен быть понятен любому грамотному программисту. какой теме? ![]() ![]() Если вы имеете ввиду то что сказал Lazin - то я с вами согласен, только в ваших постах эта позиция проявляется слабо, или я просто ее не замечаю. Насколько я понял вы имеете ввиду что программисты не должны писать сложные конструкции (это те которые не описаны в каждой книге по C++, а только в некоторых), даже там где они нужны, потому что кто-то может их не понять.. Надо писать максимально просто ..итд.. Это сообщение отредактировал(а) azesmcar - 17.5.2009, 21:46 |
|||
|
||||
fry |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 4.10.2006 Репутация: 2 Всего: 3 |
Эта срочка есть в коментах вашего поста - ответ на ваш вопрос.
ЗЫ Lazin меня понял, не знаю чего ва непонятно в моих постах. "Надо писать максимально просто, но не проще" Цитата из Страуструпа. Я про это и писал. Это сообщение отредактировал(а) fry - 17.5.2009, 21:52 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |