Массив объектов класса. Динамический. Статический. Создание Особенности. ООП C++ Для начинающих #96
Вставка
- Опубліковано 4 жов 2024
- Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут! =)
www.donationale...
или тут
/ simplecode
Массив объектов класса. Динамический. Статический. Создание Особенности. ООП C++ Для начинающих #96
Что такое массив. Примеры. Теория. Array. Одномерный массив. Синтаксис. C++. Урок #25.
goo.gl/BSyKya
Инициализация массива. Способы. Инициализация массива нулями. C++ для начинающих. Урок #26.
goo.gl/FfmV5t
Динамический массив с++ пример. Создание, заполнение, удаление, размер динамического массива. #55
goo.gl/nXCujb
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit
Массив объектов класса. Динамический. Статический. Создание Особенности. ООП C++ Для начинающих #96
Доброго времени суток. На просторах интернета встретил интересный вопрос. Как такое реализовать. Если похожее у вас обсуждалось, можете сказать в каком уроке. Может проглядел или не дошел еще, заранее спасибо. Вот сам задача(точнее кусок из нее) : создать массив из указателей на баз класс, элементами которого являются указатели на динам объекты производных классов. Не понял как это реализовать
@@richardcypher1705 я не автор. но в твоем случае ти создаешь масив типа твоего базового класса. и потом елементу етого масива присваиваеш елемент твоего производного класса. например Base *B = new Derived();
Да да именно это было мне и нужно! :)
Благодарю за бесценную работу!
Серёга как всегда. Все круто, доступно. Просто молодчина ❤❤❤
Спасибо за урок.
Спасибо большое за разъяснение. Лайк)
Великолепно, то что требовалось:) Да кст, видеоуроки с GUI по Qt планируются?
#ООП #SimpleCode #урокипрограммирования
спасибо за урок!
Огромное спасибо за урок! И всё таки, хотя бы на этом уроке пару дополнительных плюшек не были бы лишними... О том каким образом можно эти точки вывести на экран именно в виде точек. Хотя бы без пояснений.... хотя бы показать простейшую конструкцию кода, чтобы эти долбаные ТОЧКИ, всё таки были точками... =)
Спасибо за знания!
Спасибо за урок! Продолжай в том же духе!
Когда будет разбор C++ ( формы ) , работы с ее элементами и т.д ?
спасибо тебе огромное
Ничего лишнего! Норм!)
Комментарий для продвижения видео
спасибо за урок
спасибо
Спасибо за урок))
Спасибо за урок!
Вот бы такой урок по c#
стал замечать что вы в пэинте начали писать текстом, картинка на много аккуратнее получается))))
Да, нужно сразу так было делать, сейчас вообще некоторые ранние видео стыдно смотреть =)
не страшно, видео всё равно хорошие и полезные, кому нужно потерпят)))
RAHMAT DARS UCHUN;
привет из 2023. Спасибо за уроки!
В прошлом уроке об этом и подумал! Мол странно как-то массив создал :|
Но вроде смысл понял, но уточнения были бы неплохими!
Правильно ли я понял, что при записи: arr[0] = Pixel(11, 159 , 222); - мы создаем обьект(без имени и без возможности напрямую к нему обратиться) и с помощью перегрузки оператора присваивания присваиваем значения в нулевую ячейку массива? Когда я перегружал оператор "=" , компилятор принял только такую запись(с двумя амперсандами, а не одним):
Pixel& operator=(Pixel &&other) // вот тут стоит два амперсанда
{
this->r = other.r;
this->g = other.g;
this->b = other.b;
return *this;
}
Связано ли это с отсутствием имени у создаваемого обьекта Pixel(11, 159 , 222) ?
В коде у Сергея , как я понял, вызвался дефолтный оператор присваивания и обьект в нулевой ячейке массива просто начал указывать на новосозданный обькт. Приведет ли это к каким-нибудь ошибкам?
Уже поздно, но все равно хочется знать ответ. Может кто-то напишет.Потому что класс маленький, ничего страшного.А если это будет что-то тяжелое? Не очень то хочется чтобы выполнялось побитовое копирование. Тем более при работе с памятью одного объекта все вроде ясно. А когда массив, как себя ведут объекты и конструкторы?
ждем ответ. не нашел толковый на просторах
@@dmitrdmitr157 до сих пор ответа нет(
@@ДмитрийНормов-ю6ц В данном случае используется оператор перемещения. Он применяется в местах, где экземпляр класса уже был ранее определен и к нему применяется operator =, который в качестве аргумента приминает rvalue-ссылку(т.е. &&) на экземпляр этого же класса (если же оператор принимает lvalue-ссылку , то вызовется оператор присваивания).
int main()
{
int length = 3;
pixel* arr = new pixel[length];
cout
Два амперсанда, потому что тебе нужно получить доступ к объекту, а он у тебя находится в массиве. Т.е ->arr->obj
спасибо)
спасибо! Сергей, а курс по "с++ " сколько ,примерно, уроков будет?
Добрый день! Есть вопрос: если в памяти уже создан и инициализирован экземпляр класса, и его помещают в vector через pushback() (или в динамический массив каким-то методом), то этот массив будет работать с копией экземпляра или же с указателем на уже созданный экземпляр? Контекст вопроса - как лучше работать с большим количеством сложных экземпляров классов/структур (например, с объектами атомов в полимере)?
Здравствуйте. Не поняла синтаксис создания статического массива объектов класса. Вот ваш пример: Pixel arr[Size] = {Pixel(2,3,5), Pixel(6,5,7), Pixel(4,9,0), Pixel(2,8,7), Pixel(1,2,6) };. Как работает код в фигурных скобках? Мы напрямую обращаемся каждый раз к конструктору?
именно так, при инициализации этого массива объектов Pixel arr[Size] = {Pixel(2,3,5), Pixel(6,5,7), Pixel(4,9,0), Pixel(2,8,7), Pixel(1,2,6) }; каждый объект этого массива (Pixel(2,3,5), Pixel(6,5,7).... и т.д.) создается чз конструктор класса,)
@@СправаФея Спасибо, твой ответ очень сильно мне помог =)
11:42 здесь вы говорите про динамический массив, а показываете не совсем динамический. Либо я чего-то в этом мире не понимаю. Динамический массив это такой массив, размер которого можно изменять во время работы программы. Например, можно в любое время удалить из него любые элементы (при этом сократив его размер на N удалённых элементов) либо добавить новые. А вы создаёте массив фиксированного размера и наываете его динамическим. Обьясните этот момент.
Я читал, что в C/C++ нет динамических массивов. Однако, с помощью функций "malloc" и "realloc" можно динамически менять размер выделенной памяти и использовать ее как динамический массив.
Ваш код должен выглядеть следующим образом:
Pixel* pix;
int len = 5;
pix = (Pixel*)malloc(sizeof(Pixel) * len);
pix[0] = new Pixel(255, 123, 0);
Но почему-то это не сработает.
Компилятор будет выдавать ошибку: no match for 'operator=' (operand types are 'Pixel' and 'Pixel*'
А если писать без оператора new, то работать будет. Но если класс Pixel будет содержать в себе еще классы, то они будут создаваться и сразу уничтожаться. Их содержимое превратится в мусор.
Подскажите, пожалуйста, как это исправить?
Нет, динамический массив на нормальном языке - это вот то, что автор описал (я имею в виду в с++). То, что вы имеете в виду - это VLA, списки, vector и т.д. С++ работает на более низком уровне, а там массивы определяются сразу с размером, для иного поведения нужны более высокоуровневые конструкции, которые в общем-то не совсем массивы
@@АрманСоколовский Спасибо. Я уже разобрался.
Можно ли как-то обратиться сразу ко всем объектам массива и вызвать у них всех метод класса?
есть ли на канале видео про массив Vector?
Все четко и понятно, спасибо Вам за урок.
Есть вопрос, а можно ли объекты созданные через new (в динамической памяти) передавать в массив? Пример: создаём класс "монстры" добавляем много динамически созданных монстров в массив и если монстра убили, то его delete arr[n], где arr[n] - new Monster();
тож задумался над таким вопросом)))
В массиве память уже выделена для объекта на этапе создания. new лишь получает указатель на объект а не сам объект. Вы можете создать массив указателей и делать как вы описали, но это бред, зачем это, если можно сразу хранить объект в массиве?
Нельзя так делать, ибо удаленный класс оставит после себя пустое место и при обращению к его старому индексу будет выдавать билеберду. Используй лучше контейнеры (векторы, листы там), создай функцию создания класса в этом векторе монстров и удаления, чтобы избежать утечек памяти.
Всё понятно, спасибо. Есть вопрос! А с классами - наследниками по аналогии делать? Допустим у меня есть абстрактный класс Animal и наследники Cat, Dog.
Animal *pAnimal = new Animal[1];
pAnimal[0] = Cat(/*аргументы*/);
pAnimal[1] = Dog(/*аргументы*/);
я правильно понимаю?
Понимаю, что уже поздно, но вы не нашли ответ на этот вопрос? Тоже этим интересуюсь.
@@Mark-rc4lz Да, можно хранить наследников в массиве, разве что перед обращением к их методам нужно провести dawncast
При создании динамического массива объектов через фигурные скобочки так же можно инициализировать массив, однако по умолчанию созданный массив не инициализирован :-/
ну для этого нужен конструктор по умолчанию , чтобы заполнять массив , если ты не хочешь его инициализировать при первом создании
10:17 это *HDR*
А как изменить потом значение размера массива? Например, LENTGTH=5, массив заполнился 5 элементами. Как в него добавить шестой, седьмой, чтобы не выйти за пределы массива? Можно ли реализовать функцию заполнения?
Я попробовал вот так:
int LENGTH = 1;
int Count = 0;
Pixel* arr = new Pixel[LENGTH];
void PrintArray(Pixel* parr)
{
for (int i = 0; i < LENGTH; i++;)
{
cout g;
cout > b;
arr[Count] = Pixel(r, g, b);
PrintArray(arr);
LENGTH++;
Count++;
Работает 3 или 4 раза, потом выкидывает из программы. Почему так происходит?
Ты через конструктор копирования должен создать новый динамический массив под нужное кол - во ячеек, затем скопировать элементы из одного в другой, а оставшимся присвоить нужные тебе значения.
@@lovxxsЭто да, но вообще, чтобы не заморачиваться, можно использовать std::array или std::vector
а если в классе предусмотрен только конструктор с параметрами?
Подскажите, как работает механизм приравнивания объектов одного типа? В Вашем примере arr[0] = Pixel( 11, 11, 222 ).
Через конструктор.
Я тоже не особо понял, ИМХО нужно перегружать оператор присваивания, но Сергей вроде не занимался этим
если нет перегрузки компилятор сам копирует все переменные в классе без использования конструкторов и тд
Spsb
Я, конечно, понимаю, что видео уже 6 лет, но может кто ответит. Вопрос такой: можно ли создать массив (статический/динамический - не важно) объектов класса с конструктором не по умолчанию? То есть я понимаю, что нельзя будет при таком способе задать разные параметры объектам, но можно ли создать массив объектов с конструктором не по умолчанию, в который будет передан параметр, который в итоге будет одинаковым у всех созданных объектов класса? Надеюсь понятно выразил суть своего вопроса, заранее спасибо, если кто-то ответит
Так, мб кому пригодится. Нашёл на stackoverflow похожий вопрос и судя по всему с обычными массивами так не получится сделать, но это возможно реализовать через вектор
@@RedstoneAndCB
ну, тогда, как альтернатива, по идее можно попробовать инициализировать объекты просто через цикл
for (int i = 0 ; i < SIZE ; i++)
{
arr[i] = Pixel(255, 255, 255);
}
P.S. и тут наверное "= Pixel( "
В зависимости от передаваемого значения, вызовется нужный конструктор
@@sleepyNovember_project не помню уже, для чего мне это нужно было, но спасибо 😄
@@RedstoneAndCB ну да, время быстро идёт, кто-то написал свой коммент только 2 месяца назад, а кто-то 5 лет назад, но так и не получил ответа на свой вопрос 🥀
+
здравствуйте. столкнулся с таким вопросом, нужно создать массив объектов для шаблона класса динамический. у меня вижуал ругается при создании оного: Bank *man = new Bank [size]. подчеркивает класс и пишет отсутствует список параметров. Далее заполнение каждого объекта (в задаче - клиента банка) планирую с помощью создания шаблонного объекта: Bank man[1] (Name, Surname, Secondname, count); Но как я говорил выше выдает ошибку, я уже думаю создать второй дружественный класс и создать массив объектов через него и там же конструктор прописать. Подскажите, как лучше действовать в такой ситуации? И массив объектов для шаблона получается не создать? (два конструктора не пропишешь)
up
+++++
Спасибо за урок.
спасибо за урок!
Спасибо
Спасибо за урок.
Спасибо за урок