Найти в Дзене

КАК СОЗДАТЬ ОБЪЕКТ КЛАССА В ДРУГОМ КЛАССЕ НА С++.

Этот материал является частью моих занятий по программированию с теми, кто только начинает свой путь в программировании на C++ и Qt/Qml. Не является полным и исчерпывающим гайдом. В языке программирования C++ создание объектов классов — это очень частая история, как вы понимаете. И есть один нюанс, который очень часто молодые специалисты оставляют без внимания: это удаление объектов. Допустим у нас есть класс А. В нем мы хотим создать объект другого класса (например B). Что мы получим в терминале после запуска программы: В этой программе существует один большой косяк - отсутствует удаление объекта b. Что приведет к утечке памяти, а потом и к падению программы. В C++ за динамическое выделение памяти отвечает `new`. Внимание! Проект не соберется! это только демонстрация другой ошибки. Исправим ошибку так, как вы могли бы предложить. И часто предлагаете. Добавим конструкцию с `if()` и `delete` в деструктор. И это правильный подход. Получили ошибку: ============================ In destr
Оглавление
Этот материал является частью моих занятий по программированию с теми, кто только начинает свой путь в программировании на C++ и Qt/Qml.
Не является полным и исчерпывающим гайдом.

1. Создание объекта в С++

В языке программирования C++ создание объектов классов — это очень частая история, как вы понимаете.

И есть один нюанс, который очень часто молодые специалисты оставляют без внимания: это удаление объектов.

Допустим у нас есть класс А. В нем мы хотим создать объект другого класса (например B).

Пример реализации классов A и B

-2
Отсутствует удаление объекта b.
Отсутствует удаление объекта b.
-4

Что мы получим в терминале после запуска программы:

Отсутствует деструктор объекта b
Отсутствует деструктор объекта b

В этой программе существует один большой косяк - отсутствует удаление объекта b. Что приведет к утечке памяти, а потом и к падению программы.

В C++ за динамическое выделение памяти отвечает `new`.

`new` и `delete` ходят парой, должны использоваться вместе.

Как только написали `new` - сразу пишите `delete` там где объект должен исчезнуть.

2. Исправим ошибку, как правильно использовать `delete` в C++

Внимание! Проект не соберется! это только демонстрация другой ошибки.

Исправим ошибку так, как вы могли бы предложить. И часто предлагаете.

Добавим конструкцию с `if()` и `delete` в деструктор. И это правильный подход.

Осталось как было
Осталось как было
В деструкторе добавили проверку существования объекта и удалили его.
В деструкторе добавили проверку существования объекта и удалили его.
-8
-9

**НО!** такой проект не соберется, по следующей причине:

Получили ошибку:

============================

In destructor 'ClassA::~ClassA()'

'b' was not declared in this scope

=============================

Кратко обсудим.

Когда отработает `new`, он даст нам адрес в памяти.

Это значит что адрес 'b' не будет ноль и мы сравниваем, если адрес объекта 'b' не равен, грубо говоря, нулю, значит такой объект был где то создан, и он занимает память.

Важно!

Использовать просто delete без if(b != nullptr) - я строго не рекомендую. Это может вызвать падение программы в работе.

Нужно всегда проверять перед использованием `delete`.

Вот таким образом:

-10

Отсюда вытекает еще одно важное правило!

Существует разные руководящие документы по отраслям, например автомобильной промышленности, он же ISO (как ГОСТ, только международный), где четко сказано, любая переменная должна быть проинициализирована.

Короче, вот вариант как проект должен выглядеть. Делайте так. Пункт 3.

3. Рабочий вариант как создать объект одного класса внутри другого

-11
-12
-13
-14
-15

Результат выполнения программы:

При запуске этой программы вы получите следующий вывод:

-16

Промежуточный итог

  • Необходимо внимательно относиться к динамическому созданию и удалению объектов.
  • Не забывать про использование `delete`.
  • Не забывать делать проверку if( b != nullptr).

В C++ управление памятью - это ответственность программиста и его квалификации.

Что, в свою очередь, делает код менее безопасным.

В результате чего, разработчики Qt предусмотрели способ автоматического удаления объекта.

А разработчики C++ - придумали умные указатели, такие как unique_ptr и другие.

Ссылка на файлы в GitFlic

Всем До новых встреч в эфире)