std::function | Полиморфная обёртка функции | Изучение С++ для начинающих. Урок

แชร์
ฝัง
  • เผยแพร่เมื่อ 29 ธ.ค. 2024
  • Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)
    ✅Указатель на функцию в качестве параметра. Передача функции в качестве параметра. С++ Урок #65
    bit.ly/2s1qndK
    ✅Цикл foreach C++ | range-based циклы | Изучение С++ для начинающих. Урок #137
    bit.ly/2IGexQu
    ✅Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут!=)
    ✅ www.donationale...
    ✅ Telegram канал t.me/SergeySim...
    Уроки по программированию
    ✅Наша группа ВК smplcode
    ✅Подписывайтесь на канал / @simplecodeit

ความคิดเห็น • 115

  • @SimpleCodeIT
    @SimpleCodeIT  6 ปีที่แล้ว +51

    *Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*

  • @dirakon8819
    @dirakon8819 6 ปีที่แล้ว +69

    Масив функций! Ура, мечта сбылась!

    • @Funkbass1986
      @Funkbass1986 ปีที่แล้ว

      Да, вещь прикольная, спору нет, но как оно будет компилироваться на avr8 например? Я раньше массив указателей на функции ручками, ручками писал. 😅

    • @DadundddaD
      @DadundddaD ปีที่แล้ว

      А если union или variant использовать, то массив функций с разными типами и сигнатурами можно будет использовать.

  • @go5190
    @go5190 6 ปีที่แล้ว +60

    Спасибо! Уроки по С++ на ютубе одни из лучших!

  • @pavelnovikov3894
    @pavelnovikov3894 3 ปีที่แล้ว +6

    ЭТО САМОЕ ИМБОВОЕ ЧТО Я ВИДЕЛ В СВОЕЙ ЖИЗНИ, СПАСИБО СЕРГЕЙ!!!

  • @tsohee9145
    @tsohee9145 5 ปีที่แล้ว +12

    Отличные уроки на логику!!!
    И не важно программист вы или нет, или даже и не собираетесь быть программистом.
    Автору огромное спасибо и пожалуйста продолжайте!

  • @pastuhovnikita
    @pastuhovnikita ปีที่แล้ว

    Артём, спасибо тебе большое! Как коллега по языку - ты один из нас, профессионалов. Везде даю ссылку на твои занятия как эталон. Ты - лучший!

  • @andrewbistroff7558
    @andrewbistroff7558 6 ปีที่แล้ว +25

    Сергей очередной раз спасибо за ваши шикарные труды, вы топ!

  • @SimpleCodeIT
    @SimpleCodeIT  6 ปีที่แล้ว +12

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

  • @maxpo801
    @maxpo801 4 ปีที่แล้ว +7

    Вы замечательный! Потрясающее изложение материала!

  • @Ermine882
    @Ermine882 6 ปีที่แล้ว +10

    Спасибо за урок, как всегда!

  • @kartostroy
    @kartostroy 5 ปีที่แล้ว +2

    Очень полезный инструмент этот function. Спасибо огромное. C++ - это дебри, но это классно)

  • @segars9604
    @segars9604 7 หลายเดือนก่อน

    Спасибо за бесценный труд!

  • @andreyzavalishchev4818
    @andreyzavalishchev4818 6 ปีที่แล้ว +5

    Интересный урок, спасибо Сергей!

  • @vladalu9794
    @vladalu9794 6 ปีที่แล้ว +6

    Супер интересно, как всегда! спасибо

  • @radium6230
    @radium6230 6 ปีที่แล้ว +13

    Огромное спасибо. Очень жду подробно про лямбды

  • @artlinestudio6735
    @artlinestudio6735 3 ปีที่แล้ว +3

    Один из важнейших уроков. Спасибо Сергей! Просим продолжения по С++.

  • @НикитаСеребряков-е1в
    @НикитаСеребряков-е1в 2 ปีที่แล้ว +1

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

  • @Toorall
    @Toorall 6 ปีที่แล้ว +5

    Спасибо за интересный урок!)

  • @proKaps
    @proKaps 6 ปีที่แล้ว +7

    Очень годно и так понятно опять! Я даже и не думал пока, что такие вещи изучать а теперь знаю! Спасибо! Жду следующего урока.

  • @KurpatovInstagram
    @KurpatovInstagram 6 ปีที่แล้ว +1

    Большое спасибо!

  • @cataract813
    @cataract813 6 ปีที่แล้ว +3

    блестящее объяснение!
    спасибо за вашу работу

  • @eduardeduard933
    @eduardeduard933 4 ปีที่แล้ว +2

    Великолепно, массив функций!

  • @flexterion
    @flexterion ปีที่แล้ว

    Лучшие уроки по C++

  • @flepjack
    @flepjack 3 ปีที่แล้ว

    Спасибо,Сергей, вы лучший!

  • @proox4557
    @proox4557 3 ปีที่แล้ว +1

    Очень хороший урок! Вообще канал просто супер! Каждое видео - все по делу, никакой воды!
    Если будет возможность, сделайте видео по boost::bind в связке с boost::asio. Очень не хватает хорошего понятного материала по этой теме

  • @SeriousSam0009
    @SeriousSam0009 2 หลายเดือนก่อน

    Это требует много практики. Продолжаю удивляться возможностям плюсов

  • @idhoppers
    @idhoppers 6 ปีที่แล้ว +6

    Желаю тебе много-много подписчиков, спасибо за уроки!

  • @Евгений-ф9я3о
    @Евгений-ф9я3о 6 ปีที่แล้ว +4

    хорошее объяснение. спасибо

  • @PanVladyslav
    @PanVladyslav 6 ปีที่แล้ว +4

    урок супер ,давно ждал его

  • @pavelios3577
    @pavelios3577 6 ปีที่แล้ว +1

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

  • @aleksandercross5936
    @aleksandercross5936 5 ปีที่แล้ว

    После "указателей на функции" смотрю это, чтобы понять что же такое лямбда функции). Спасибо вам за уроки

  • @cheatack2141
    @cheatack2141 3 ปีที่แล้ว

    Классный урок, очень интересно.

  • @sashatim8244
    @sashatim8244 6 ปีที่แล้ว +4

    Спасибо!

  • @inbtcwetrust6747
    @inbtcwetrust6747 2 ปีที่แล้ว

    спасибо тебе друг, наконец-то кто то мне объяснил что такое фунтуры, теперь пойду смотреть лямбду

  • @croche3398
    @croche3398 6 ปีที่แล้ว +1

    Как всегда на высоте! В том же духе!

  • @kolosrodoskyi
    @kolosrodoskyi 6 ปีที่แล้ว +3

    благадарачка. Как всегда.

  • @СарматПересветов
    @СарматПересветов 2 ปีที่แล้ว

    очень интересно, спасибо!

  • @mykhailomorhal2181
    @mykhailomorhal2181 6 ปีที่แล้ว +2

    Спасибо)

  • @АлексейБаринов-ь5н
    @АлексейБаринов-ь5н 4 ปีที่แล้ว +1

    Боже, как это круто

  • @ide9827
    @ide9827 ปีที่แล้ว

    просто охренеть как круто

  • @dmitry2334
    @dmitry2334 6 ปีที่แล้ว +22

    Отличные уроки , на ютюбе только основы , а у тебя все мелочи и это помогает развиваться .Вопрос будет ли оьучение c# или python?

    • @SimpleCodeIT
      @SimpleCodeIT  6 ปีที่แล้ว +5

      c# будет, точно когда не скажу.

  • @TheTimur123
    @TheTimur123 3 ปีที่แล้ว

    Круто!!!

  • @progerlife6690
    @progerlife6690 5 ปีที่แล้ว

    Офигеть!!!! Спасибо!!!Лайк и подписка!!!!!

  • @archi6200
    @archi6200 6 ปีที่แล้ว +2

    v top!

  • @geraltt1455
    @geraltt1455 4 ปีที่แล้ว

    круто!

  • @ЯрославГоловко-ф6и
    @ЯрославГоловко-ф6и 4 ปีที่แล้ว

    спасибо

  • @medetkhanaltynbek1442
    @medetkhanaltynbek1442 3 ปีที่แล้ว

    Incredible! Real Brainiac ahah

  • @PanVladyslav
    @PanVladyslav 6 ปีที่แล้ว +3

    поскорее бы видио урок про лямбды

  • @Uni-Coder
    @Uni-Coder 6 ปีที่แล้ว +12

    Таки чем же отличается std::function от обычного указателя на функцию?

    • @DevilAlex03
      @DevilAlex03 5 ปีที่แล้ว +2

      std::function - класс, указатель на функцию - указатель на функцию

    • @defined_user
      @defined_user 5 ปีที่แล้ว +28

      В С++ функции и указатели на функции имеют свой четкий тип, так void foo(int i) имеет тип "функция принимающая 1 аргумент целочисленного значения и возвращающая пустоту". Указатель на нее будет иметь тип "указатель на ф-ю ... (см. выше)". Если рассматривать методы класса (для примера взят метод класса А), то их тип - "функция класса А, принимающая 1 аргумент ... (см. выше)" - совершенно другой тип, указатель на нее - "указатель на функцию класса А ... (см. выше)". В связи с этим, ранее описанный указатель на глобальную ф-ю не может указывать на метод класса А, так же как и указатель на метод класса А не может указывать на глобальную функцию, ведь их типы совершенно разные. Аналогичная ситуация происходит с использованием указателя на метод класса, когда у нас есть несколько классов, ведь void foo(int i) из класса А и void foo(int i) из класса В будут иметь разные типы. std::function же позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной.

    • @АлексейСвиридов-о5э
      @АлексейСвиридов-о5э 4 ปีที่แล้ว +10

      @@hvac_vdk Объект типа std::function может содержать не только непосредственно указатель на функцию, но и указатель на "функциональный объект", т.е. объект некоторого класса, для которого переопределен operator() - оператор круглых скобок. В таком случае синтаксис вызова этого переопределенного оператора у объекта будет совпадать с синтаксисом вызова обычной функции.

    • @TheTimur123
      @TheTimur123 3 ปีที่แล้ว

      @@defined_user чётко объяснил! Спасибо!!

    • @leemon6574
      @leemon6574 ปีที่แล้ว

      @@defined_user Указатель на функцию также "позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной".
      То есть, нет никакой разницы в использовании между указателем на функцию и шаблоном std::function во всех случаях указанных в предыдущем коментарии, кроме случая с "функциональным объектом".

  • @stensej6841
    @stensej6841 4 ปีที่แล้ว +2

    Потный урок , но интересный !

  • @КОД-ш8у
    @КОД-ш8у 5 ปีที่แล้ว +3

    А теперь ДЗ: сделать так что бы результаты двух функций вывродились отдельно друг от друга, тоесть вначале БАР потом ФОО (разделённые бекспейсом)

    • @hdfroggit3051
      @hdfroggit3051 4 ปีที่แล้ว +2

      местами поменять foreach с числами и foreach с функциями (в теле foreach с функциями будет foreach с числами в теле которого будет fel(el); )

  • @digimikeh
    @digimikeh 5 ปีที่แล้ว +1

    thanks, what is the difference between std::function and lambdas?

  • @TheTimur123
    @TheTimur123 3 ปีที่แล้ว +1

    Подскажите, разве нельзя передавать указатель на массив указателей на функции? В чем преимущество именно std::functional ?

    • @Kokurorokuko
      @Kokurorokuko 2 ปีที่แล้ว +1

      defined_user:
      В С++ функции и указатели на функции имеют свой четкий тип, так void foo(int i) имеет тип "функция принимающая 1 аргумент целочисленного значения и возвращающая пустоту". Указатель на нее будет иметь тип "указатель на ф-ю ... (см. выше)". Если рассматривать методы класса (для примера взят метод класса А), то их тип - "функция класса А, принимающая 1 аргумент ... (см. выше)" - совершенно другой тип, указатель на нее - "указатель на функцию класса А ... (см. выше)". В связи с этим, ранее описанный указатель на глобальную ф-ю не может указывать на метод класса А, так же как и указатель на метод класса А не может указывать на глобальную функцию, ведь их типы совершенно разные. Аналогичная ситуация происходит с использованием указателя на метод класса, когда у нас есть несколько классов, ведь void foo(int i) из класса А и void foo(int i) из класса В будут иметь разные типы. std::function же позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной.

  • @mikhail_kochubey
    @mikhail_kochubey 2 ปีที่แล้ว

    Здравствуйте! Как создать массив из функций с разными сигнатурами? (если это вообще возможно)

  • @godfather7695
    @godfather7695 2 หลายเดือนก่อน

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

  • @eugheniygancharik3276
    @eugheniygancharik3276 6 ปีที่แล้ว +2

    Немного не понимаю, зачем это нужно, если вместо класса function можно использовать typedef и указатель на функцию
    typedef void(*FUNC)(int)
    Результат будет таким же, просто реализация без сторонних инклудов
    или я ошибаюсь?

    • @hdfroggit3051
      @hdfroggit3051 4 ปีที่แล้ว +1

      Именно такая сигнатура используется и поддерживается в STL

  • @guiterenzog2723
    @guiterenzog2723 2 ปีที่แล้ว +1

    17:45, почему по ссылке?

    • @ДмитрийНормов-ю6ц
      @ДмитрийНормов-ю6ц 2 ปีที่แล้ว

      потому что нам не надо менять значения.

    • @guiterenzog2723
      @guiterenzog2723 2 ปีที่แล้ว +1

      @@ДмитрийНормов-ю6ц, передача данных по ссылке как раз и позволяет менять значение

    • @ДмитрийНормов-ю6ц
      @ДмитрийНормов-ю6ц 2 ปีที่แล้ว

      @@guiterenzog2723 , ага. Ну и экономия памяти...

  • @sofiyabelskaya7650
    @sofiyabelskaya7650 4 ปีที่แล้ว

    А можно ли осуществить перегрузку таких функций разными сигнатурами объекта std::function?

    • @kvoistinov
      @kvoistinov 3 ปีที่แล้ว

      можно, поскольку в перегрузке будет конкретное инстанцирование шаблона std::function, т. е. свой тип.

  • @nikitasuyazov2060
    @nikitasuyazov2060 4 หลายเดือนก่อน

    А кто говорил, что будет легко? Концентрация знаний из прошлых уроков. Вроде бы понял всё при помощи отладчика, но нужен опыт, чтобы прям вникнуть и не сомневаться.

  • @АлександраЕменка
    @АлександраЕменка 2 ปีที่แล้ว

    Вопрос: незя в функции do вставить 2 функции эти а не через vector передавать?

  • @777noob777saibot
    @777noob777saibot 3 ปีที่แล้ว

    Это как обобщение в Си шарп. Видимо в обоих языках эти фигурные скобки используются одинаково. И Вектор тоже использует это обобщение.

  • @АлонияРинэ
    @АлонияРинэ 6 ปีที่แล้ว

    Здравствуйте, только что нашла ваш канал, так что заранее прошу прощения, если вы уже затрагивали эти вопросы. Подскажите, пожалуйста, при написании на с++ в visual studio 2017 или code blocks какая версия языка идёт по умолчанию, т е как понять на какой версии языка я пишу?

  • @Канал-ш7с
    @Канал-ш7с 8 หลายเดือนก่อน +2

    а зачем это нужно если есть указатели на функцию?

  • @bchelste
    @bchelste ปีที่แล้ว

    👍🏽

  • @anatoliyv5607
    @anatoliyv5607 ปีที่แล้ว

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

  • @jangiryanarsen4952
    @jangiryanarsen4952 6 ปีที่แล้ว

    объектная сущность-обертка функции Foo

  • @Genberi
    @Genberi 6 ปีที่แล้ว

    Только не понял почему при втором переборе используется ссылка на элементы.
    void Perebor(vector &v, vector fuVect)
    {
    for (auto el : v)
    {
    for (auto &fEl : fuVect)
    {
    fEl(el);
    }
    }
    }

    • @maxchatsky2898
      @maxchatsky2898 6 ปีที่แล้ว

      Скорее всего, это для оптимизации. Чтобы копия функции не создавалась и не занимала лишнего места.

    • @tsohee9145
      @tsohee9145 5 ปีที่แล้ว

      Там она (ссылка) и для первого элемента используется. Только не понятно почему для первого вектора прием по ссылке объявлен в объявлении переменных функции. а для второго не там же, а в объявлении цикла.

    • @tsohee9145
      @tsohee9145 5 ปีที่แล้ว

      В общем и так и так работает и вообще не по ссылке тоже все работает. Без разницы.

  • @HeavyHeavyvich
    @HeavyHeavyvich 5 ปีที่แล้ว

    Все же в чем отличие от указателя на функцию? Просто удобная обертка?

  • @zo8349
    @zo8349 2 หลายเดือนก่อน

    Извините, а не легче ли просто добавить условие в функции бар и фу, мол если не четное, вызывается бар к примеру? Хотя возможно массив функций уместен при большом их кол- ве, но я в этом опыта не имею. По поводу того что постоянно придётся менять эти 2 поля, ну и что, зато не нужны будут никакие массивы функций. И программа будет проще и меньше ресурсов займёт.

  • @STRANEV
    @STRANEV 3 ปีที่แล้ว

    Чё-то я так и не понял, в чем преимущество объектов function, над указателями на функции?..

  • @sergeykirdyankin7027
    @sergeykirdyankin7027 ปีที่แล้ว

    Есть ли отличие от указателей на функцию?

    • @docaner
      @docaner ปีที่แล้ว

      Как я подразумеваю, указатель на функцию хранит в себе адрес функции. Объект function уже хранит в себе непосредственно саму функцию. Различия соответственно в скорости доступа и занимаемой памяти, если я всё правильно понял.

  • @primate472
    @primate472 4 ปีที่แล้ว +1

    урок #0, 1лям просмотров
    #142, 17к просмотров

  • @Tragraph
    @Tragraph 6 ปีที่แล้ว +4

    Так это же с# делегат.

  • @olegiv4814
    @olegiv4814 2 หลายเดือนก่อน

    С указателями на функцию меньше затрат.

  • @sagecat5696
    @sagecat5696 6 ปีที่แล้ว +3

    Прошу прощения, не могли бы вы мне помочь?
    Я очень бы хотел начать осваивать оконное программирование, но только вот не знаю с чего начать и что выбрать (WINAPI, MFC, CLR). Как лучше начинать изучать его?
    Во первых, стоит ли остановится на средствах языка С++ или уже намного лучше программировать с С#, Java?
    Во вторых, я бы хотел изучить оконное программирования не на уровне, как в редакторе набросать кнопочек, а более глубоко, где мне искать ресурсы, ибо перечитывать документацию майкрософт, я думаю будет неэффективно.

    • @iii-mk7no
      @iii-mk7no 5 ปีที่แล้ว +6

      Используй визуал студию или Qt. Там нет ничего сложного в создании оконного проекта. Вин апи он сложнее на мой взгляд. Там без документации некуда, читай на МСДН как работает функция и методы и вперед. Изучив С++ тебе потом не составит никакого труда перейти на с# и ява. Зато ты в полной мере поймешь что такое наследование , полиморфизм и инкапсуляция. И с паттернами более лучше разберешься. Еще плюс С++ в том что он строго типизированный язык, и имеет более низкий уровень, можешь так же и с железом работать. Еще его плюс в том, что он более мощный и гибкий(лично мое мнение), да все самое топовое пишется в основном на нем. Какой нибудь Асасинс Крид или Крайзис не сделать с применением явы, с# что то более ли мение близкое еще можно, и то скорее всего сам движек будет написан на с++, а сама реализация игры уже на шарпе. Про Pyton, вообще отдельный разговор. Одни эти отступы задолбут, код съедит вправо что потом хрен свой код сам поймешь. Он проще, но в тоже время и убогий. На нем хорошо писать нейросеть и для вэб разроботки. Я лично разбирался так. Нашел инструкцию как создать вин приложение в визуал. Оно было не вин апи, там использовался почти чистый с++. Взял за образец другую программу и пытался тупо ее скопировать. Накидал кнопок и т.д. и писал свою реализацию к ним. А вин апи в первые пришлось использовать когда писал взлом к игре. Свой инжектор. Как бы немного подсмотрел другие реализации в интернете. Взял от туда методы, зашел на МСДН. Читал как сделать снимки системы, найти процесс, хендлы и тд. Поставь для себя конкретную задачу, написать что то. Сделай план на бумаге - если в голове все удержать не можешь. А потом гугли как решить то или иное, конкретно из твоей задачи. И методом проб и ошибок ты добъешься результата. Поймешь работу, синтаксис и тд.

    • @МаксимРебянов
      @МаксимРебянов 4 ปีที่แล้ว

      @@iii-mk7no Есть ли смысл идти работать стажером C++, если планируешь потом осваивать другой язык программирования (C#)? И как понять, что у меня достаточно знаний?

    • @iii-mk7no
      @iii-mk7no 4 ปีที่แล้ว +6

      @@МаксимРебянов Все языки программирования они С подобные. (думаю только асемблер небольшое исключение из правил. Там больше на машинный код похоже) . А так освоив С++ вы сможете в полной мере насладится ООП, понять весь смысл парадигм, понять что такое типы данных(строго типизированный язык) и т.д. Я периодически пишу на Pyton. После С++ это как задачи первого класса решать. А С# он практически тот же С++, только немного облегченный для программиста. Добавили сборщиков мусора и других вещей о чем нужно было думать в С++. Если у тебя есть возможность влезть в эту сферу и тем более в С++, даже не сомневайся. С него ты вольешься в другие языки. А вот если с пайтона в с++ уже будет труднее.

  • @XXX-to8fv
    @XXX-to8fv 4 ปีที่แล้ว

    Лично я не понял преимущества functional я могу так же сделать все.Получается на 2-3 стр больше,но при этом я голову не ломаю

    • @Kokurorokuko
      @Kokurorokuko 2 ปีที่แล้ว

      defined_user:
      В С++ функции и указатели на функции имеют свой четкий тип, так void foo(int i) имеет тип "функция принимающая 1 аргумент целочисленного значения и возвращающая пустоту". Указатель на нее будет иметь тип "указатель на ф-ю ... (см. выше)". Если рассматривать методы класса (для примера взят метод класса А), то их тип - "функция класса А, принимающая 1 аргумент ... (см. выше)" - совершенно другой тип, указатель на нее - "указатель на функцию класса А ... (см. выше)". В связи с этим, ранее описанный указатель на глобальную ф-ю не может указывать на метод класса А, так же как и указатель на метод класса А не может указывать на глобальную функцию, ведь их типы совершенно разные. Аналогичная ситуация происходит с использованием указателя на метод класса, когда у нас есть несколько классов, ведь void foo(int i) из класса А и void foo(int i) из класса В будут иметь разные типы. std::function же позволяет указывать на любую функцию, независимо от того является ли она методом класса, методом какого класса, глобальной или анонимной.

  • @mosdomveteran9323
    @mosdomveteran9323 5 ปีที่แล้ว

    Вот здесь у меня сломалась голова.

  • @PanVladyslav
    @PanVladyslav 6 ปีที่แล้ว

    почему функция Baz отработала быстрее всех ? это из - за того что мы туда ничего не передали ? никакой логики помимо cout ?

    • @proKaps
      @proKaps 6 ปีที่แล้ว +3

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

  • @hcoderhy768
    @hcoderhy768 9 หลายเดือนก่อน

    F.U.B.A.R????

  • @Antonov_Ivan.
    @Antonov_Ivan. 10 หลายเดือนก่อน

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

  • @miroslavklyukovsky683
    @miroslavklyukovsky683 3 ปีที่แล้ว +1

    Спасибо!

  • @xaoc3932
    @xaoc3932 2 ปีที่แล้ว

    Круто!!

  • @DD0S2
    @DD0S2 3 ปีที่แล้ว

    спасибо

  • @НикитаСолотин
    @НикитаСолотин 3 ปีที่แล้ว

    спасибо

  • @pashudzu
    @pashudzu 6 หลายเดือนก่อน

    Спасибо