Тёмный

Массив объектов класса. Динамический. Статический. Создание Особенности. ООП C++ Для начинающих #96 

#SimpleCode
Подписаться 367 тыс.
Просмотров 122 тыс.
50% 1

Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут! =)
www.donationalerts.ru/r/simple...
или тут
/ simplecode
Массив объектов класса. Динамический. Статический. Создание Особенности. ООП C++ Для начинающих #96
Что такое массив. Примеры. Теория. Array. Одномерный массив. Синтаксис. C++. Урок #25.
goo.gl/BSyKya
Инициализация массива. Способы. Инициализация массива нулями. C++ для начинающих. Урок #26.
goo.gl/FfmV5t
Динамический массив с++ пример. Создание, заполнение, удаление, размер динамического массива. #55
goo.gl/nXCujb
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit

Опубликовано:

 

16 окт 2017

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 78   
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
Массив объектов класса. Динамический. Статический. Создание Особенности. ООП C++ Для начинающих #96
@richardcypher1705
@richardcypher1705 5 лет назад
Доброго времени суток. На просторах интернета встретил интересный вопрос. Как такое реализовать. Если похожее у вас обсуждалось, можете сказать в каком уроке. Может проглядел или не дошел еще, заранее спасибо. Вот сам задача(точнее кусок из нее) : создать массив из указателей на баз класс, элементами которого являются указатели на динам объекты производных классов. Не понял как это реализовать
@andrii_harashchak
@andrii_harashchak 5 лет назад
@@richardcypher1705 я не автор. но в твоем случае ти создаешь масив типа твоего базового класса. и потом елементу етого масива присваиваеш елемент твоего производного класса. например Base *B = new Derived();
@user-cv3ng9rn8g
@user-cv3ng9rn8g 7 месяцев назад
Серёга как всегда. Все круто, доступно. Просто молодчина ❤❤❤
@segars9604
@segars9604 9 месяцев назад
Благодарю за бесценную работу!
@yippeeki-yey
@yippeeki-yey 5 лет назад
Великолепно, то что требовалось:) Да кст, видеоуроки с GUI по Qt планируются?
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
#ООП #SimpleCode #урокипрограммирования
@Ermine882
@Ermine882 6 лет назад
Спасибо за урок.
@SP1K3
@SP1K3 6 лет назад
Спасибо большое за разъяснение. Лайк)
@user-nw5iw5ew9z
@user-nw5iw5ew9z 3 года назад
Спасибо за урок! Продолжай в том же духе!
@Deonnisiy
@Deonnisiy 5 лет назад
Да да именно это было мне и нужно! :)
@user-bc4vi6hl2f
@user-bc4vi6hl2f 6 лет назад
спасибо за урок!
@user-hz4ho1ox1q
@user-hz4ho1ox1q 4 года назад
Спасибо за знания!
@BrownAleks
@BrownAleks 4 года назад
Огромное спасибо за урок! И всё таки, хотя бы на этом уроке пару дополнительных плюшек не были бы лишними... О том каким образом можно эти точки вывести на экран именно в виде точек. Хотя бы без пояснений.... хотя бы показать простейшую конструкцию кода, чтобы эти долбаные ТОЧКИ, всё таки были точками... =)
@kaynsolo
@kaynsolo 6 лет назад
Ничего лишнего! Норм!)
@C2H5OHH
@C2H5OHH 2 года назад
Спасибо за урок!
@user-ut7tj6bp4t
@user-ut7tj6bp4t 4 года назад
Спасибо за урок))
@user-je5yr6ol6c
@user-je5yr6ol6c 6 лет назад
Когда будет разбор C++ ( формы ) , работы с ее элементами и т.д ?
@user-fh9kt8ne1e
@user-fh9kt8ne1e 4 года назад
спасибо за урок
@user-ij4rv9yi7s
@user-ij4rv9yi7s 2 года назад
Спасибо за урок
@overdoses1794
@overdoses1794 6 лет назад
спасибо! Сергей, а курс по "с++ " сколько ,примерно, уроков будет?
@artyomkazakov9414
@artyomkazakov9414 Год назад
спасибо тебе огромное
@user-kb6qd8rg4g
@user-kb6qd8rg4g 4 года назад
спасибо
@matrosya1
@matrosya1 3 года назад
Вот бы такой урок по c#
@flepjack
@flepjack 3 года назад
Спасибо
@D.Nugget
@D.Nugget 3 года назад
спасибо)
@nissanovod
@nissanovod 4 года назад
Добрый день! Есть вопрос: если в памяти уже создан и инициализирован экземпляр класса, и его помещают в vector через pushback() (или в динамический массив каким-то методом), то этот массив будет работать с копией экземпляра или же с указателем на уже созданный экземпляр? Контекст вопроса - как лучше работать с большим количеством сложных экземпляров классов/структур (например, с объектами атомов в полимере)?
@ilnev3738
@ilnev3738 3 года назад
Комментарий для продвижения видео
@a_tozhiev_1620
@a_tozhiev_1620 4 года назад
RAHMAT DARS UCHUN;
@tyomka4265
@tyomka4265 6 лет назад
стал замечать что вы в пэинте начали писать текстом, картинка на много аккуратнее получается))))
@SimpleCodeIT
@SimpleCodeIT 6 лет назад
Да, нужно сразу так было делать, сейчас вообще некоторые ранние видео стыдно смотреть =)
@tyomka4265
@tyomka4265 6 лет назад
не страшно, видео всё равно хорошие и полезные, кому нужно потерпят)))
@user-qn7rc9ii7i
@user-qn7rc9ii7i Год назад
есть ли на канале видео про массив Vector?
@vladromanenko386
@vladromanenko386 5 лет назад
Можно ли как-то обратиться сразу ко всем объектам массива и вызвать у них всех метод класса?
@user-ol9es1ch9x
@user-ol9es1ch9x Год назад
привет из 2023. Спасибо за уроки!
@LimarDeWills
@LimarDeWills 5 лет назад
Все четко и понятно, спасибо Вам за урок. Есть вопрос, а можно ли объекты созданные через new (в динамической памяти) передавать в массив? Пример: создаём класс "монстры" добавляем много динамически созданных монстров в массив и если монстра убили, то его delete arr[n], где arr[n] - new Monster();
@user-or1hy4xz8u
@user-or1hy4xz8u 2 года назад
тож задумался над таким вопросом)))
@Kitsunee2222
@Kitsunee2222 Год назад
В массиве память уже выделена для объекта на этапе создания. new лишь получает указатель на объект а не сам объект. Вы можете создать массив указателей и делать как вы описали, но это бред, зачем это, если можно сразу хранить объект в массиве?
@user-lt1iz1kg4c
@user-lt1iz1kg4c 10 месяцев назад
Нельзя так делать, ибо удаленный класс оставит после себя пустое место и при обращению к его старому индексу будет выдавать билеберду. Используй лучше контейнеры (векторы, листы там), создай функцию создания класса в этом векторе монстров и удаления, чтобы избежать утечек памяти.
@alexeyprofit5911
@alexeyprofit5911 5 лет назад
Правильно ли я понял, что при записи: 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
@dmitrdmitr157 3 года назад
Уже поздно, но все равно хочется знать ответ. Может кто-то напишет.Потому что класс маленький, ничего страшного.А если это будет что-то тяжелое? Не очень то хочется чтобы выполнялось побитовое копирование. Тем более при работе с памятью одного объекта все вроде ясно. А когда массив, как себя ведут объекты и конструкторы?
@gamepwoandrey
@gamepwoandrey 2 года назад
ждем ответ. не нашел толковый на просторах
@user-or1hy4xz8u
@user-or1hy4xz8u 2 года назад
@@dmitrdmitr157 до сих пор ответа нет(
@absenceofvalueandmeaning2816
@absenceofvalueandmeaning2816 2 года назад
​@@user-or1hy4xz8u В данном случае используется оператор перемещения. Он применяется в местах, где экземпляр класса уже был ранее определен и к нему применяется operator =, который в качестве аргумента приминает rvalue-ссылку(т.е. &&) на экземпляр этого же класса (если же оператор принимает lvalue-ссылку , то вызовется оператор присваивания). int main() { int length = 3; pixel* arr = new pixel[length]; cout
@user-vy1dh6re2z
@user-vy1dh6re2z Год назад
Два амперсанда, потому что тебе нужно получить доступ к объекту, а он у тебя находится в массиве. Т.е ->arr->obj
@user-ci2ku2oo5u
@user-ci2ku2oo5u 6 лет назад
Здравствуйте. Не поняла синтаксис создания статического массива объектов класса. Вот ваш пример: Pixel arr[Size] = {Pixel(2,3,5), Pixel(6,5,7), Pixel(4,9,0), Pixel(2,8,7), Pixel(1,2,6) };. Как работает код в фигурных скобках? Мы напрямую обращаемся каждый раз к конструктору?
@user-rm3eu6we8c
@user-rm3eu6we8c 5 лет назад
именно так, при инициализации этого массива объектов 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).... и т.д.) создается чз конструктор класса,)
@jellyfish6042
@jellyfish6042 2 года назад
@@user-rm3eu6we8c Спасибо, твой ответ очень сильно мне помог =)
@developer-miracle
@developer-miracle 5 лет назад
Всё понятно, спасибо. Есть вопрос! А с классами - наследниками по аналогии делать? Допустим у меня есть абстрактный класс Animal и наследники Cat, Dog. Animal *pAnimal = new Animal[1]; pAnimal[0] = Cat(/*аргументы*/); pAnimal[1] = Dog(/*аргументы*/); я правильно понимаю?
@Mark-rc4lz
@Mark-rc4lz Год назад
Понимаю, что уже поздно, но вы не нашли ответ на этот вопрос? Тоже этим интересуюсь.
@developer-miracle
@developer-miracle Год назад
@@Mark-rc4lz Да, можно хранить наследников в массиве, разве что перед обращением к их методам нужно провести dawncast
@micekmk
@micekmk 6 лет назад
Подскажите, как работает механизм приравнивания объектов одного типа? В Вашем примере arr[0] = Pixel( 11, 11, 222 ).
@kaynsolo
@kaynsolo 6 лет назад
Через конструктор.
@alexpdream677
@alexpdream677 6 лет назад
Я тоже не особо понял, ИМХО нужно перегружать оператор присваивания, но Сергей вроде не занимался этим
@validdoll
@validdoll 5 лет назад
если нет перегрузки компилятор сам копирует все переменные в классе без использования конструкторов и тд
@6666BLACKSATAN
@6666BLACKSATAN 4 года назад
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 будет содержать в себе еще классы, то они будут создаваться и сразу уничтожаться. Их содержимое превратится в мусор. Подскажите, пожалуйста, как это исправить?
@user-qm4or3bt4v
@user-qm4or3bt4v 3 года назад
Нет, динамический массив на нормальном языке - это вот то, что автор описал (я имею в виду в с++). То, что вы имеете в виду - это VLA, списки, vector и т.д. С++ работает на более низком уровне, а там массивы определяются сразу с размером, для иного поведения нужны более высокоуровневые конструкции, которые в общем-то не совсем массивы
@6666BLACKSATAN
@6666BLACKSATAN 3 года назад
@@user-qm4or3bt4v Спасибо. Я уже разобрался.
@user-gt3sp9od1y
@user-gt3sp9od1y Год назад
а если в классе предусмотрен только конструктор с параметрами?
@Voha
@Voha 2 года назад
10:17 это *HDR*
@byaka8kaka
@byaka8kaka 5 лет назад
+
@user-ye7vc6ug1l
@user-ye7vc6ug1l 4 года назад
Spsb
@AlekseyVarfalomich
@AlekseyVarfalomich 4 года назад
При создании динамического массива объектов через фигурные скобочки так же можно инициализировать массив, однако по умолчанию созданный массив не инициализирован :-/
@user-ij4rv9yi7s
@user-ij4rv9yi7s 2 года назад
ну для этого нужен конструктор по умолчанию , чтобы заполнять массив , если ты не хочешь его инициализировать при первом создании
@user-iz6nx9kw5q
@user-iz6nx9kw5q 10 месяцев назад
А как изменить потом значение размера массива? Например, 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 раза, потом выкидывает из программы. Почему так происходит?
@not_today_better_now
@not_today_better_now 9 месяцев назад
Ты через конструктор копирования должен создать новый динамический массив под нужное кол - во ячеек, затем скопировать элементы из одного в другой, а оставшимся присвоить нужные тебе значения.
@sleepyNovember_project
@sleepyNovember_project 2 месяца назад
​@@not_today_better_nowЭто да, но вообще, чтобы не заморачиваться, можно использовать std::array или std::vector
@teawavesurfer
@teawavesurfer 4 года назад
здравствуйте. столкнулся с таким вопросом, нужно создать массив объектов для шаблона класса динамический. у меня вижуал ругается при создании оного: Bank *man = new Bank [size]. подчеркивает класс и пишет отсутствует список параметров. Далее заполнение каждого объекта (в задаче - клиента банка) планирую с помощью создания шаблонного объекта: Bank man[1] (Name, Surname, Secondname, count); Но как я говорил выше выдает ошибку, я уже думаю создать второй дружественный класс и создать массив объектов через него и там же конструктор прописать. Подскажите, как лучше действовать в такой ситуации? И массив объектов для шаблона получается не создать? (два конструктора не пропишешь)
@RedstoneAndCB
@RedstoneAndCB 7 месяцев назад
Я, конечно, понимаю, что видео уже 6 лет, но может кто ответит. Вопрос такой: можно ли создать массив (статический/динамический - не важно) объектов класса с конструктором не по умолчанию? То есть я понимаю, что нельзя будет при таком способе задать разные параметры объектам, но можно ли создать массив объектов с конструктором не по умолчанию, в который будет передан параметр, который в итоге будет одинаковым у всех созданных объектов класса? Надеюсь понятно выразил суть своего вопроса, заранее спасибо, если кто-то ответит
@RedstoneAndCB
@RedstoneAndCB 7 месяцев назад
Так, мб кому пригодится. Нашёл на stackoverflow похожий вопрос и судя по всему с обычными массивами так не получится сделать, но это возможно реализовать через вектор
@sleepyNovember_project
@sleepyNovember_project 4 месяца назад
@@RedstoneAndCB ну, тогда, как альтернатива, по идее можно попробовать инициализировать объекты просто через цикл for (int i = 0 ; i < SIZE ; i++) { arr[i] = Pixel(255, 255, 255); } P.S. и тут наверное "= Pixel( " В зависимости от передаваемого значения, вызовется нужный конструктор
@RedstoneAndCB
@RedstoneAndCB 4 месяца назад
@@sleepyNovember_project не помню уже, для чего мне это нужно было, но спасибо 😄
@sleepyNovember_project
@sleepyNovember_project 4 месяца назад
@@RedstoneAndCB ну да, время быстро идёт, кто-то написал свой коммент только 2 месяца назад, а кто-то 5 лет назад, но так и не получил ответа на свой вопрос 🥀
@user-tr6mf1ps5n
@user-tr6mf1ps5n Год назад
+++++
@Viamsupervadetvadens
@Viamsupervadetvadens 6 лет назад
up
@pavelios3577
@pavelios3577 6 лет назад
Спасибо за урок.
@talesuleymanov4778
@talesuleymanov4778 6 лет назад
спасибо за урок!
@sabatr1989
@sabatr1989 6 лет назад
Спасибо за урок.
Далее