Снимите, пожалуйста, видео о том, как разделять проект на файлы и как это всё подключать между собой, как подключать сторонние библиотеки, создавать свои, или просто как подключить готовый класс к проекту. Как пользоваться hex-редакторами и смаке.
Это просто супер канал! Уже посмотрел все видео в этом плэйлисте и начал по чуть-чуть кодить. Знания, как известно, без практики забываются (эти не исключение), поэтому приходится периодически возвращаться, чтобы решить проблему, и этот видос мне помог. Никак не мог понять, почему у меня не освобождается память, а вот оно) правда для решения моей проблемы (да и представленной в этом уроке) можно было бы просто использовать умные указатели (они будут дальше по курсу), но я про них чёт забыл :D В общем ОГРОМНОЕ СПАСИБО СЕРГЕЮ!
Очень странно, что так мало у Вас подписчиков, принимая во внимание качество контента. Скажу только вот что, удачи Вам.) Надеюсь в скором времени всё изменится в кардинально лучшую сторону. Ведь всё таки у Вас на порядок более хорошее преподношение контента.
Очень добросовестно. Хорошо бы текстовую версию, хотя бы исходник, и хорошо бы номер урока в названии ролика впереди поставить, а на заставке сместить влево, чтобы длительность ролика не забивала. Во избежание недоразумений - я очень высоко оцениваю, может это издержки отображения на моем ноутбуке утюба..
Не смотря на то, что честно проработал все предыдущие уроки, и то, что Сергей все оч. доходчиво объясняет, начинаю сдаваться.... смотрю, но почти нечего не понимаю, уж тем более не могу повторить сам. У меня вопрос ко всем, кто наткнется на этот коментарий && кому_все_понятно: вы до этого другие языки освоили, или просто честно прорабатывая все уроки в данный момент четко понимаете как работают все детали синтаксиса данного урока?
Поздний ответ, конечно, но когда что-то не получается и ты чувствуешь дискомфорт, ты учишься. Надеюсь, у Вас всё получилось с программированием или другой областью, которую Вы для себя выбрали
@@Terlod хаха, нет) У меня очередная 100500я попытка прогать на ++, под микроконтроллеры, и все идёт оооочень туго. Однозначно нужен талант или склонность, иначе это одно мучение.
тоже уперся в этот вопрос. ответ примерно такой - автор приводит удаление объекта через указатель, у этого указателя есть свой(!) тип данных, в данном случае это базовый класс, если бы тип указателя и тип объекта бы совпадал - то проблемы бы не возникало, однако ситуации всякие бывают и тут вроде как одно из решений это сделать деструктор виртуальным, а иначе вызовется только деструктор базового класса, а наследуемый деструктор пролетает, хбз откуда и как так получается но вот так вот работает С++, типа слово virtual обязывает компилятор заглянуть в наследуемый класс
Автор - молодец! Согласен, знать о виртуализации деструкторов полезно, но вот делать так, думаю, плохая практика. Сначала мы пытаемся обмануть компилятор - заказать место в памяти для класса А, а создать класс В, который занимает в памяти места больше. А потом доблестно закрываем "косяк" компилятора, который сами же и спровоцировали. И еще возник вопрос: если мы объявим еще один экземпляр объекта А и операционная система нам вернет указатель на ячейку памяти, следующую за первым объектом А, то создав этот объект, мы затрем "хвост" В. Т.е от объекта В в памяти останется только часть А? Или я не правильно понимаю?
Для тех у кого проблема с вызовом Деструктора : Не нужен никакой system("pause") или метод getchar() ..Заходите в свойства проекта Linker - General - System и Там меняете SubSystem на Console(Subsystem/Console).
@@coolomet если return 0; убрать, то main() у тебя ничего возвращать не будет, если конечно он у тебя определён с каким-либо типом(исключение - void). ну это если чисто доебаться из-за стандартов плюсов, а так можно делать что угодно, лишь бы работало
Если я правильно все понял, то правильнее и надежнее всего виртуальные деструкторы и деструкторы override лучше всегда делать "по умолчанию" во всех классах при наследовании?
Спасибо за видео! И всё же, я не до конца понимаю, что делает слово virtual. В отдельных случаях вполне понятно, но что там "под капотом", до меня не доходит.
Подскажите, плиз, а почему переопределяя виртуальный деструктор, всё же, вызывается деструктор базового? Если переопределить виртуальный метод, то будет вызван только метод наследника, а базового нет.
Потому что как было сказано в предыдущих уроках, базовый класс является частью класса наследника (Утрирую: в памяти компьютера находится слепок базового класса потом идёт участок слепок класса наследника), и как нам гласит народная мудрость - Каков цикл жизни класса = вызывается конструктор, и потом когда класс отработал своё вызывается деструктор. Схема вызова в данном уроке = Конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.
@@petardo7783 : Бред пишите. Тогда прочему в прошлых уроках вызыванный метод Shoot() отрабатывал только у того объекта класса, через который данный метод был вызван. По вашей логике, вызывая Shoot у Submachinegun, отработал бы Shoot и у Gun и у Weapon, если бы не был чисто виртуальным.. Они же все "является частью класса наследника". Я думаю логика для виртуальных деструкторов просто написана через костыли, вот и все.
спасибо за столь ценные уроки! вопрос: player.Shoot(new Gun) деструктор Gun не вызывается. это значит, что происходит утечка памяти и так лучше не делать?
Новый объект создастся, его адрес будет передан в метод Shoot и после завершения метода - потеряется в пространстве и времени. После этого удалить объект будет невозможно.
Было бы очень разумно, если в плюсах бы был OFF/ON-режим для авто-освобождения используемых ресурсов как в др. яз. В этом случае плюсы были бы еще более ценнее. Но сейчас "в ручную" все это "ворганить" не очень приятно и надежно. Для ручного контроля утечки памяти на плюсах все же требуется большая внимательность и бдительность.
Потому что если смотреть в сторону ООП, то каждый класс несёт свои данные. Классы наследники дополняют базовый класс (Расширяют функционал). Но можно из класса наследника устанавливать значения для базового класса.
деструкторьі вьізьіваются в тот же самьій момент. Более того, автор в данном уроке и описьівает конструктор и деструктор без вьіделения динамической памяти, а только симулирует вьіводом сообщения в консоль
У меня в Code::Blocks если этого не сделать, то компилятор пишет предупреждение: "warning: deleting object of abstract class type 'Gun' which has non-virtual destructor will cause undefined behavior [-Wdelete-non-virtual-dtor]|"
Ясно зачем это надо, не ясно только где логика в этом. Ведь такие манипуляции для методов мы делали как раз таки чтоб система понимала что надо вызвать один конкретный метод в каком либо классе наследников, а не все методы с похожим на званием вплоть до базового.
Блен, я понял это делается чтоб вызвать именно деструктор класса наследника, а уже он чтоб уничтожить объект своего класса вызывает деструктор базового и так по цепочке😳
Ну смотри, как говорилось в видео про динамическую память, если не освобождать эту память(сорь за тафтологию), то будет утечка памяти и будет перегружаться твоя оперативка
Нет. Это цепочка событий, создаётся конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.
*Друзья, если вы решили изучать программирование и подписались на канал - рекомендую вам нажать колокольчик чтобы никогда не пропускать новые уроки!*
Снимите, пожалуйста, видео о том, как разделять проект на файлы и как это всё подключать между собой, как подключать сторонние библиотеки, создавать свои, или просто как подключить готовый класс к проекту. Как пользоваться hex-редакторами и смаке.
Довод опыт да дар швед давно
Тут остались только самые настойчивые и заинтересованные ребята. Спасибо за видео!
🙃 не только! здесь началось самое прикольное! ООП гораздо веселее чем процедурный код😉. Только теперь появился настоящий интерес
за 8 месяцев как продвинулись?
это все базовая база, самое начало начал, так сказать
ты просто лучший человек!!
#виртуальныйдеструктор #ООП #SimpleCode #урокипрограммирования
Спасибо за бесценный труд!)
Как всегда на высоте и как всегда спасибо!
Спасибо за урок! Жирнющий такой ЛАЙК!
Большое спасибо за урок! Смотрим всей студенческой группой)
Спасибо за урок!
Это просто супер канал! Уже посмотрел все видео в этом плэйлисте и начал по чуть-чуть кодить. Знания, как известно, без практики забываются (эти не исключение), поэтому приходится периодически возвращаться, чтобы решить проблему, и этот видос мне помог. Никак не мог понять, почему у меня не освобождается память, а вот оно) правда для решения моей проблемы (да и представленной в этом уроке) можно было бы просто использовать умные указатели (они будут дальше по курсу), но я про них чёт забыл :D В общем ОГРОМНОЕ СПАСИБО СЕРГЕЮ!
Сергей, вы просто лучший!!!!Благодаря вам я за 10 дней и просмотром 16-ти тем за день поднял перед экзаменом С++ с нуля!!!!!
Как раз то что доктор прописал!!!
Спасибо за хороший урок!
Как всегда, очень хорошо.
Очень странно, что так мало у Вас подписчиков, принимая во внимание качество контента. Скажу только вот что, удачи Вам.) Надеюсь в скором времени всё изменится в кардинально лучшую сторону. Ведь всё таки у Вас на порядок более хорошее преподношение контента.
Спасибо за поддержку!
И, Вам, за уроки.)
Сколько подписчиков было в тот время?
@@saidjonasrorov1721 около 20-50 тыс
Очень добросовестно. Хорошо бы текстовую версию, хотя бы исходник, и хорошо бы номер урока в названии ролика впереди поставить, а на заставке сместить влево, чтобы длительность ролика не забивала. Во избежание недоразумений - я очень высоко оцениваю, может это издержки отображения на моем ноутбуке утюба..
Комментарий благодарности и для поддержки автора, контент лучший!
просто коммент для продвижения!
Отличное видео! Спасибо!
Thanks a lot, understood each details from it
хорошо и понятно обьясняеш, спасибо!
Спасибо!
отличные уроки, как всегда лайк!
Спасибо за видео)
Круто молодец! Продолжай!
Не смотря на то, что честно проработал все предыдущие уроки, и то, что Сергей все оч. доходчиво объясняет, начинаю сдаваться.... смотрю, но почти нечего не понимаю, уж тем более не могу повторить сам.
У меня вопрос ко всем, кто наткнется на этот коментарий && кому_все_понятно: вы до этого другие языки освоили, или просто честно прорабатывая все уроки в данный момент четко понимаете как работают все детали синтаксиса данного урока?
что именно сложно понять?
Поздний ответ, конечно, но когда что-то не получается и ты чувствуешь дискомфорт, ты учишься. Надеюсь, у Вас всё получилось с программированием или другой областью, которую Вы для себя выбрали
@@Terlod хаха, нет)
У меня очередная 100500я попытка прогать на ++, под микроконтроллеры, и все идёт оооочень туго.
Однозначно нужен талант или склонность, иначе это одно мучение.
@@aleksandrdrobyshev7623 Как у вас дела, Вы еще программируете на с++ или сдались?
тоже уперся в этот вопрос. ответ примерно такой - автор приводит удаление объекта через указатель, у этого указателя есть свой(!) тип данных, в данном случае это базовый класс, если бы тип указателя и тип объекта бы совпадал - то проблемы бы не возникало, однако ситуации всякие бывают и тут вроде как одно из решений это сделать деструктор виртуальным, а иначе вызовется только деструктор базового класса, а наследуемый деструктор пролетает, хбз откуда и как так получается но вот так вот работает С++, типа слово virtual обязывает компилятор заглянуть в наследуемый класс
"так само" і "а далі" гріє душу)
Всем рассказываю, какой Вы крутой!)
Спасибо
Супер)) Спасибо
Мне нравится монтаж видео
4:17 - Сергей про грамматическую ошибку, с кодом все как и должно быть....
Автор - молодец! Согласен, знать о виртуализации деструкторов полезно, но вот делать так, думаю, плохая практика. Сначала мы пытаемся обмануть компилятор - заказать место в памяти для класса А, а создать класс В, который занимает в памяти места больше. А потом доблестно закрываем "косяк" компилятора, который сами же и спровоцировали. И еще возник вопрос: если мы объявим еще один экземпляр объекта А и операционная система нам вернет указатель на ячейку памяти, следующую за первым объектом А, то создав этот объект, мы затрем "хвост" В. Т.е от объекта В в памяти останется только часть А? Или я не правильно понимаю?
тоже интересно
неправильно.
Что ты курил? это фишка ООП
Для тех у кого проблема с вызовом Деструктора : Не нужен никакой system("pause") или метод getchar() ..Заходите в свойства проекта Linker - General - System и Там меняете SubSystem на Console(Subsystem/Console).
Ещё можно вместо этого тупо убрать return 0;, а system("pause"); оставить.
@@coolomet если return 0; убрать, то main() у тебя ничего возвращать не будет, если конечно он у тебя определён с каким-либо типом(исключение - void). ну это если чисто доебаться из-за стандартов плюсов, а так можно делать что угодно, лишь бы работало
Я на каждый урок новый проект делаю, мне проще system("pause") написать, чем каждый раз в установках копаться.
Если я правильно все понял, то правильнее и надежнее всего виртуальные деструкторы и деструкторы override лучше всегда делать "по умолчанию" во всех классах при наследовании?
Класс!
you are the best
Спасибо за видео!
И всё же, я не до конца понимаю, что делает слово virtual. В отдельных случаях вполне понятно, но что там "под капотом", до меня не доходит.
Очень подробно в #103 он объяснил. При чем в разных вариациях. Просмотри тот урок.
Подскажите, плиз, а почему переопределяя виртуальный деструктор, всё же, вызывается деструктор базового? Если переопределить виртуальный метод, то будет вызван только метод наследника, а базового нет.
Потому что как было сказано в предыдущих уроках, базовый класс является частью класса наследника (Утрирую: в памяти компьютера находится слепок базового класса потом идёт участок слепок класса наследника), и как нам гласит народная мудрость - Каков цикл жизни класса = вызывается конструктор, и потом когда класс отработал своё вызывается деструктор.
Схема вызова в данном уроке = Конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.
@@petardo7783 : Бред пишите. Тогда прочему в прошлых уроках вызыванный метод Shoot() отрабатывал только у того объекта класса, через который данный метод был вызван. По вашей логике, вызывая Shoot у Submachinegun, отработал бы Shoot и у Gun и у Weapon, если бы не был чисто виртуальным.. Они же все "является частью класса наследника".
Я думаю логика для виртуальных деструкторов просто написана через костыли, вот и все.
@@arty1f Я думаю, Вы правы насчёт костылей. Скорее всего, слово virtual работает немного по-разному с обычными методами и с деструкторами.
@@Kokurorokuko похоже на то что это правда
все понятно)
Спасибо за урок ну немного подправлю сам обьект удаляется ну вот если в этом обьекте будет динамический масив он останется
спасибо за столь ценные уроки! вопрос: player.Shoot(new Gun) деструктор Gun не вызывается. это значит, что происходит утечка памяти и так лучше не делать?
Новый объект создастся, его адрес будет передан в метод Shoot и после завершения метода - потеряется в пространстве и времени. После этого удалить объект будет невозможно.
@@Сергей-т9д7в спасибо, так всё-таки он останется в памяти, пока программа выполняется... не стоит так делать)
Было бы очень разумно, если в плюсах бы был OFF/ON-режим для авто-освобождения используемых ресурсов как в др. яз. В этом случае плюсы были бы еще более ценнее. Но сейчас "в ручную" все это "ворганить" не очень приятно и надежно. Для ручного контроля утечки памяти на плюсах все же требуется большая внимательность и бдительность.
В таком случае вам нужно перейти на c# :D
👏
Danke
А что мешает использовать вместо классической схемы, vector для выделения динамической памяти ?
там всё само очищается.
Нашёл ответ на этот вопрос?
@@maksvell_777 походу нет(
А почему тогда конструктор не надо переопределять?
Потому что если смотреть в сторону ООП, то каждый класс несёт свои данные. Классы наследники дополняют базовый класс (Расширяют функционал). Но можно из класса наследника устанавливать значения для базового класса.
потому что конструктор наследника не может вызваться, если не вызвался конструктор базового класса, так что переопределять и не нужно
ясненько, но не понятно только в какой момент вызываются деструкторы в случае объектов без динамического выделения памяти
деструкторьі вьізьіваются в тот же самьій момент. Более того, автор в данном уроке и описьівает конструктор и деструктор без вьіделения динамической памяти, а только симулирует вьіводом сообщения в консоль
Сегодня был вопрос про виртуальный деструктор от работодателя. Не смог ответить.
4:19, опечатка на суть не влияет, даже не обратил внимание)
Виртуальный и с реализацией? Вот тут совсем запутался...
Виртуальный, но не чисто виртуальный, поэтому и реализация вполне допустима
У меня в Code::Blocks если этого не сделать, то компилятор пишет предупреждение: "warning: deleting object of abstract class type 'Gun' which has non-virtual destructor will cause undefined behavior [-Wdelete-non-virtual-dtor]|"
Через pragma думаю решиться проблема
up
Ясно зачем это надо, не ясно только где логика в этом. Ведь такие манипуляции для методов мы делали как раз таки чтоб система понимала что надо вызвать один конкретный метод в каком либо классе наследников, а не все методы с похожим на званием вплоть до базового.
Блен, я понял это делается чтоб вызвать именно деструктор класса наследника, а уже он чтоб уничтожить объект своего класса вызывает деструктор базового и так по цепочке😳
@@pubgr862 так тогда бы вызывался вначале деструктор базового класса, а потом только наследника
В топ
👍👍👍👍👍👏👏👏👌👌👌👌
56
В чем проблема, если не вызывается деструктор?
Ну смотри, как говорилось в видео про динамическую память, если не освобождать эту память(сорь за тафтологию), то будет утечка памяти и будет перегружаться твоя оперативка
Lafy я понимаю это. Но пробдема в том что , что у меня не вызывается деструкиэтор.
у тебя просто наверное не настроено, у тебя диструктор выводиться после "нажмите любую клавишу чтобы продолжить..."
ну либо что-то не так делаешь)
так и есть , у многих такая проблема
Тоесть,это деструктор класса A,который,вызывает деструктор B?
Нет. Это цепочка событий, создаётся конструктор базового класса, конструктор класса наследника, деструктор класса наследника, деструктор базового класса.
Спасибо за урок!
Спасибо!!!
спасибо
Спасибо за урок!
Спасибо
Спасибо
спасибо