Массив объектов класса. Динамический. Статический. Создание Особенности. ООП 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

КОМЕНТАРІ • 79

  • @SimpleCodeIT
    @SimpleCodeIT  7 років тому +33

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

    • @richardcypher1705
      @richardcypher1705 5 років тому

      Доброго времени суток. На просторах интернета встретил интересный вопрос. Как такое реализовать. Если похожее у вас обсуждалось, можете сказать в каком уроке. Может проглядел или не дошел еще, заранее спасибо. Вот сам задача(точнее кусок из нее) : создать массив из указателей на баз класс, элементами которого являются указатели на динам объекты производных классов. Не понял как это реализовать

    • @andrii_harashchak
      @andrii_harashchak 5 років тому

      @@richardcypher1705 я не автор. но в твоем случае ти создаешь масив типа твоего базового класса. и потом елементу етого масива присваиваеш елемент твоего производного класса. например Base *B = new Derived();

  • @Deonnisiy
    @Deonnisiy 6 років тому +14

    Да да именно это было мне и нужно! :)

  • @segars9604
    @segars9604 Рік тому +3

    Благодарю за бесценную работу!

  • @АндрейБородин-м8д
    @АндрейБородин-м8д 11 місяців тому +3

    Серёга как всегда. Все круто, доступно. Просто молодчина ❤❤❤

  • @pavelios3577
    @pavelios3577 6 років тому +11

    Спасибо за урок.

  • @SP1K3
    @SP1K3 6 років тому +18

    Спасибо большое за разъяснение. Лайк)

  • @yippeeki-yey
    @yippeeki-yey 6 років тому +53

    Великолепно, то что требовалось:) Да кст, видеоуроки с GUI по Qt планируются?

  • @SimpleCodeIT
    @SimpleCodeIT  7 років тому +17

    #ООП #SimpleCode #урокипрограммирования

  • @talesuleymanov4778
    @talesuleymanov4778 6 років тому +5

    спасибо за урок!

  • @BrownAleks
    @BrownAleks 4 роки тому +14

    Огромное спасибо за урок! И всё таки, хотя бы на этом уроке пару дополнительных плюшек не были бы лишними... О том каким образом можно эти точки вывести на экран именно в виде точек. Хотя бы без пояснений.... хотя бы показать простейшую конструкцию кода, чтобы эти долбаные ТОЧКИ, всё таки были точками... =)

  • @АлександрЛитвинюк-х2ы

    Спасибо за знания!

  • @ДмитрийБузницкий-б3н

    Спасибо за урок! Продолжай в том же духе!

  • @ОлегЖариков-ь1ы
    @ОлегЖариков-ь1ы 7 років тому +39

    Когда будет разбор C++ ( формы ) , работы с ее элементами и т.д ?

  • @artyomkazakov9414
    @artyomkazakov9414 2 роки тому +1

    спасибо тебе огромное

  • @kaynsolo
    @kaynsolo 6 років тому +2

    Ничего лишнего! Норм!)

  • @ilnev3738
    @ilnev3738 3 роки тому +2

    Комментарий для продвижения видео

  • @МихайлоПиж
    @МихайлоПиж 4 роки тому +1

    спасибо за урок

  • @ЯрославГоловко-ф6и
    @ЯрославГоловко-ф6и 4 роки тому +2

    спасибо

  • @ГусейнСалахов
    @ГусейнСалахов 4 роки тому +1

    Спасибо за урок))

  • @C2H5OHH
    @C2H5OHH 3 роки тому

    Спасибо за урок!

  • @matrosya1
    @matrosya1 3 роки тому +1

    Вот бы такой урок по c#

  • @tyomka4265
    @tyomka4265 6 років тому +8

    стал замечать что вы в пэинте начали писать текстом, картинка на много аккуратнее получается))))

    • @SimpleCodeIT
      @SimpleCodeIT  6 років тому +4

      Да, нужно сразу так было делать, сейчас вообще некоторые ранние видео стыдно смотреть =)

    • @tyomka4265
      @tyomka4265 6 років тому +18

      не страшно, видео всё равно хорошие и полезные, кому нужно потерпят)))

  • @a_tozhiev_1620
    @a_tozhiev_1620 4 роки тому +3

    RAHMAT DARS UCHUN;

  • @ИванКозловский-ш9н

    привет из 2023. Спасибо за уроки!

  • @Александр-й2в2о
    @Александр-й2в2о Місяць тому

    В прошлом уроке об этом и подумал! Мол странно как-то массив создал :|
    Но вроде смысл понял, но уточнения были бы неплохими!

  • @alexeyprofit5911
    @alexeyprofit5911 5 років тому +10

    Правильно ли я понял, что при записи: 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 4 роки тому

      Уже поздно, но все равно хочется знать ответ. Может кто-то напишет.Потому что класс маленький, ничего страшного.А если это будет что-то тяжелое? Не очень то хочется чтобы выполнялось побитовое копирование. Тем более при работе с памятью одного объекта все вроде ясно. А когда массив, как себя ведут объекты и конструкторы?

    • @gamepwoandrey
      @gamepwoandrey 2 роки тому +1

      ждем ответ. не нашел толковый на просторах

    • @ДмитрийНормов-ю6ц
      @ДмитрийНормов-ю6ц 2 роки тому +1

      @@dmitrdmitr157 до сих пор ответа нет(

    • @absenceofvalueandmeaning2816
      @absenceofvalueandmeaning2816 2 роки тому +4

      ​@@ДмитрийНормов-ю6ц В данном случае используется оператор перемещения. Он применяется в местах, где экземпляр класса уже был ранее определен и к нему применяется operator =, который в качестве аргумента приминает rvalue-ссылку(т.е. &&) на экземпляр этого же класса (если же оператор принимает lvalue-ссылку , то вызовется оператор присваивания).
      int main()
      {
      int length = 3;
      pixel* arr = new pixel[length];
      cout

    • @евгешааксентьев
      @евгешааксентьев 2 роки тому

      Два амперсанда, потому что тебе нужно получить доступ к объекту, а он у тебя находится в массиве. Т.е ->arr->obj

  • @D.Nugget
    @D.Nugget 3 роки тому

    спасибо)

  • @overdoses1794
    @overdoses1794 6 років тому +5

    спасибо! Сергей, а курс по "с++ " сколько ,примерно, уроков будет?

  • @nissanovod
    @nissanovod 4 роки тому +3

    Добрый день! Есть вопрос: если в памяти уже создан и инициализирован экземпляр класса, и его помещают в vector через pushback() (или в динамический массив каким-то методом), то этот массив будет работать с копией экземпляра или же с указателем на уже созданный экземпляр? Контекст вопроса - как лучше работать с большим количеством сложных экземпляров классов/структур (например, с объектами атомов в полимере)?

  • @Вероника-щ1ф6у
    @Вероника-щ1ф6у 6 років тому +4

    Здравствуйте. Не поняла синтаксис создания статического массива объектов класса. Вот ваш пример: Pixel arr[Size] = {Pixel(2,3,5), Pixel(6,5,7), Pixel(4,9,0), Pixel(2,8,7), Pixel(1,2,6) };. Как работает код в фигурных скобках? Мы напрямую обращаемся каждый раз к конструктору?

    • @СправаФея
      @СправаФея 6 років тому +2

      именно так, при инициализации этого массива объектов 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 роки тому

      @@СправаФея Спасибо, твой ответ очень сильно мне помог =)

  • @Buruhtania
    @Buruhtania 4 роки тому +1

    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 будет содержать в себе еще классы, то они будут создаваться и сразу уничтожаться. Их содержимое превратится в мусор.
    Подскажите, пожалуйста, как это исправить?

    • @АрманСоколовский
      @АрманСоколовский 4 роки тому +1

      Нет, динамический массив на нормальном языке - это вот то, что автор описал (я имею в виду в с++). То, что вы имеете в виду - это VLA, списки, vector и т.д. С++ работает на более низком уровне, а там массивы определяются сразу с размером, для иного поведения нужны более высокоуровневые конструкции, которые в общем-то не совсем массивы

    • @Buruhtania
      @Buruhtania 3 роки тому

      @@АрманСоколовский Спасибо. Я уже разобрался.

  • @vladromanenko386
    @vladromanenko386 5 років тому +1

    Можно ли как-то обратиться сразу ко всем объектам массива и вызвать у них всех метод класса?

  • @Anonym-n5j
    @Anonym-n5j Рік тому

    есть ли на канале видео про массив Vector?

  • @LimarDeWills
    @LimarDeWills 5 років тому +2

    Все четко и понятно, спасибо Вам за урок.
    Есть вопрос, а можно ли объекты созданные через new (в динамической памяти) передавать в массив? Пример: создаём класс "монстры" добавляем много динамически созданных монстров в массив и если монстра убили, то его delete arr[n], где arr[n] - new Monster();

    • @ДмитрийНормов-ю6ц
      @ДмитрийНормов-ю6ц 2 роки тому

      тож задумался над таким вопросом)))

    • @Kitsunee2222
      @Kitsunee2222 2 роки тому

      В массиве память уже выделена для объекта на этапе создания. new лишь получает указатель на объект а не сам объект. Вы можете создать массив указателей и делать как вы описали, но это бред, зачем это, если можно сразу хранить объект в массиве?

    • @ЛеонидБулгаков-е2т
      @ЛеонидБулгаков-е2т Рік тому

      Нельзя так делать, ибо удаленный класс оставит после себя пустое место и при обращению к его старому индексу будет выдавать билеберду. Используй лучше контейнеры (векторы, листы там), создай функцию создания класса в этом векторе монстров и удаления, чтобы избежать утечек памяти.

  • @developer-miracle
    @developer-miracle 5 років тому +2

    Всё понятно, спасибо. Есть вопрос! А с классами - наследниками по аналогии делать? Допустим у меня есть абстрактный класс Animal и наследники Cat, Dog.
    Animal *pAnimal = new Animal[1];
    pAnimal[0] = Cat(/*аргументы*/);
    pAnimal[1] = Dog(/*аргументы*/);
    я правильно понимаю?

    • @Mark-rc4lz
      @Mark-rc4lz Рік тому

      Понимаю, что уже поздно, но вы не нашли ответ на этот вопрос? Тоже этим интересуюсь.

    • @developer-miracle
      @developer-miracle Рік тому +1

      @@Mark-rc4lz Да, можно хранить наследников в массиве, разве что перед обращением к их методам нужно провести dawncast

  • @AlekseyVarfalomich
    @AlekseyVarfalomich 5 років тому +1

    При создании динамического массива объектов через фигурные скобочки так же можно инициализировать массив, однако по умолчанию созданный массив не инициализирован :-/

    • @СултанЖусупов-б5т
      @СултанЖусупов-б5т 2 роки тому

      ну для этого нужен конструктор по умолчанию , чтобы заполнять массив , если ты не хочешь его инициализировать при первом создании

  • @Voha
    @Voha 3 роки тому

    10:17 это *HDR*

  • @игорьлюбченко-с5у

    А как изменить потом значение размера массива? Например, 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
      @lovxxs Рік тому +1

      Ты через конструктор копирования должен создать новый динамический массив под нужное кол - во ячеек, затем скопировать элементы из одного в другой, а оставшимся присвоить нужные тебе значения.

    • @sleepyNovember_project
      @sleepyNovember_project 6 місяців тому

      ​@@lovxxsЭто да, но вообще, чтобы не заморачиваться, можно использовать std::array или std::vector

  • @максимабрамов-с1п
    @максимабрамов-с1п 2 роки тому

    а если в классе предусмотрен только конструктор с параметрами?

  • @micekmk
    @micekmk 6 років тому

    Подскажите, как работает механизм приравнивания объектов одного типа? В Вашем примере arr[0] = Pixel( 11, 11, 222 ).

    • @kaynsolo
      @kaynsolo 6 років тому

      Через конструктор.

    • @alexpdream677
      @alexpdream677 6 років тому +1

      Я тоже не особо понял, ИМХО нужно перегружать оператор присваивания, но Сергей вроде не занимался этим

    • @validdoll
      @validdoll 6 років тому +2

      если нет перегрузки компилятор сам копирует все переменные в классе без использования конструкторов и тд

  • @ИНФОРМАЦИЯДЛЯУСПЕШНЫХ

    Spsb

  • @RedstoneAndCB
    @RedstoneAndCB 11 місяців тому

    Я, конечно, понимаю, что видео уже 6 лет, но может кто ответит. Вопрос такой: можно ли создать массив (статический/динамический - не важно) объектов класса с конструктором не по умолчанию? То есть я понимаю, что нельзя будет при таком способе задать разные параметры объектам, но можно ли создать массив объектов с конструктором не по умолчанию, в который будет передан параметр, который в итоге будет одинаковым у всех созданных объектов класса? Надеюсь понятно выразил суть своего вопроса, заранее спасибо, если кто-то ответит

    • @RedstoneAndCB
      @RedstoneAndCB 11 місяців тому

      Так, мб кому пригодится. Нашёл на stackoverflow похожий вопрос и судя по всему с обычными массивами так не получится сделать, но это возможно реализовать через вектор

    • @sleepyNovember_project
      @sleepyNovember_project 8 місяців тому +2

      @@RedstoneAndCB
      ну, тогда, как альтернатива, по идее можно попробовать инициализировать объекты просто через цикл
      for (int i = 0 ; i < SIZE ; i++)
      {
      arr[i] = Pixel(255, 255, 255);
      }
      P.S. и тут наверное "= Pixel( "
      В зависимости от передаваемого значения, вызовется нужный конструктор

    • @RedstoneAndCB
      @RedstoneAndCB 8 місяців тому +1

      @@sleepyNovember_project не помню уже, для чего мне это нужно было, но спасибо 😄

    • @sleepyNovember_project
      @sleepyNovember_project 8 місяців тому +2

      @@RedstoneAndCB ну да, время быстро идёт, кто-то написал свой коммент только 2 месяца назад, а кто-то 5 лет назад, но так и не получил ответа на свой вопрос 🥀

  • @byaka8kaka
    @byaka8kaka 6 років тому +1

    +

  • @teawavesurfer
    @teawavesurfer 4 роки тому

    здравствуйте. столкнулся с таким вопросом, нужно создать массив объектов для шаблона класса динамический. у меня вижуал ругается при создании оного: Bank *man = new Bank [size]. подчеркивает класс и пишет отсутствует список параметров. Далее заполнение каждого объекта (в задаче - клиента банка) планирую с помощью создания шаблонного объекта: Bank man[1] (Name, Surname, Secondname, count); Но как я говорил выше выдает ошибку, я уже думаю создать второй дружественный класс и создать массив объектов через него и там же конструктор прописать. Подскажите, как лучше действовать в такой ситуации? И массив объектов для шаблона получается не создать? (два конструктора не пропишешь)

  • @Viamsupervadetvadens
    @Viamsupervadetvadens 6 років тому

    up

  • @sabatr1989
    @sabatr1989 6 років тому +11

    Спасибо за урок.

  • @АндрейМиненко-ц3з
    @АндрейМиненко-ц3з 6 років тому +5

    спасибо за урок!

  • @flepjack
    @flepjack 3 роки тому

    Спасибо

  • @Ermine882
    @Ermine882 7 років тому +13

    Спасибо за урок.

  • @СултанЖусупов-б5т
    @СултанЖусупов-б5т 2 роки тому

    Спасибо за урок