спасибо БОЛЬШОЕ что нашли не заезженную тему . . . именно подобного этому мало в ЮТУБЕ - например, взаимодействие частей программы, навыки и приемы программирования, поиск программ в сети (на гит-хаб) и пр.
Thank you for the support i didn't anything of russian language but i understand the text, you helped me because i doesn't found examples like yours. By the way, i am mexican but doesn't matter, thanks for all!!.
Большое спасибо Сергей! Вы даже не представляете, какой шикарный контент Вы создали! Купил курс на Скиллбоксе, а учусь по вашим урокам. Лучшего контента по с++ на просто нет!
Если появляется предупреждение "ISO C++ forbids converting a string constant to 'char*'", то следует написать: void MyClass::PrintMessage(const char str[]){ std::cout
@@gogawriter9718 Потому что "вот так записанная строка" - это const char* (её невозможно изменить) , а функция PrintMessage принимает неконстантный char* (предполагается, что его возможно изменить). Короче, когда функция не изменяет данные которые в неё передаются надо всегда приписывать const.
Прекрасный урок, я бы его добавил при изучении Класса, у нас к примеру в Джава сразу учили выносить все в разные папки и каждый класс делать в отдельно созданном классе( имеется в ввиду отдельный класс в cpp с аналогией в С++)
Спасибо за видео, Сергей. Не могли бы вы сделать урок про лексический анализ строк (например, как считать строку и разбить ее на составляющие, чтобы, например, написать калькулятор)
Если в строке будет простое выражение с одним действием типа 2*6.2, то можно заюзать регулярные выражения. Это намного проще и удобнее, чем писать огромный парсер (это уже для сложных математических выражений).
@@КириллГусарев-р5х Спустя четыре года я стал девопсом и поднимаю куберы, но было приятно пересмотреть ролик вновь и поностальгировать с того, с чего начинал )
У меня студия 17-го, подчеркивает строку m.PrintMasseg("Hello World!"); а если быть точным то строку которую мы передаем "Hello World!" , ругается и пишет что не может конвертировать const char[] to char[]?
Во-первых спасибо за уроки они бесценны, а теперь вопрос: а нет случаем способа работать с шаблонными классами в понятии многофайлового проекта? По стандарту с++ реализацию таких классов советуют писать в самом header класса, но хотелось бы это делать в cpp. Буду очень благодарен за ответ.
Здравствуйте! Тоже ждал подобного урока, но у меня есть вопрос на который я пока не нашел ответ или пример реализации. Как использовать в cpp файле объект класса созданный в другом cpp файле. Пример: пишу программу для устройства на микроконтроллере. Использую стороннюю библиотеку для вебсервера. В файле init.cpp создаю объект класса: WebServer server(80); В этом файле также делаю инициализацию сервера с помощью методов данного класса, например server.begin(); и т.д. А в основном файле main.cpp я использую методы для работы с сервером server.on(........); server.handleClient(); и т.д. Соответственно в main.cpp мне как-то нужно достучаться до объекта server, пробовал объявлять как extern WebServer server(80); компилятор выдает multiply definition, пробовал extern WebServer server(int port); вылазит другая ошибка. Подскажите правильный механизм. Заранее спасибо. P.S. Если создаю объект без параметров, например Websocket socket в файле init.cpp, а в main файле: extern Websocket socket; такой объект виден в main.cpp и компиляция проходит. Я так понимаю у меня ошибка в синтаксисе - extern WebServer server(int port);
Подскажите, возможно ли как-то сделать так, чтобы директивы препроцессора тип #define работали во всем многофайловом проекте, а не только там где они были объявлены? Ну чтобы во всех файлах происходило замещение. Например сделать отдельный файл типа конфигурационный, где через #define задать какие-то значения, а потом эти значения распространились бы на все файлы проекта.
Добрый день, спасибо за видео-урок все очень доступно и понятно. Подскажите, пожалуйста, как можно использовать наследование классов в многофайловом проекте?
Наследуемся от exception. Главное не забивать подключить директиву препроцессора где лежит предок class AsLesson_Exception : public exception { public: AsLesson_Exception(const char *msg, int Data_State); int Get_Data_State(); private: int Data_State; };
А если я в другой компилятор использую Atom+ плагин gpp, я сделал тоже самое, только всё в одной папке(без папки "заголовочные файлы") у меня не находится функция из другого файла, что делать? может нужно через командную строку создать проект как-то, чтобы все нужные папки создались(например)?
эх... Все летит с ошибкой: Undefined symbols for architecture arm64: "Sum(int, int)", referenced from: _main in main.cpp.o... Дело не в арм, на Rosetta 2 тоже самое. Если не подключать файл в CmakeLists.txt, то ничего не работает, но так быть точно не должно
Спасибо за урок, не могли бы вы сделать урок на тему, "Перегрузка операторов при полиморфизме"? , а то инфо мало. Например: есть абстрактный базовый класс, A от него B, C и при перегрузке равно B = C , результат был типа B и наооборот.
@@MashkaShow К счастью, я нашла решение :) Дело в том, что я занималась реализацией шаблонного класса - тогда ещё не знала, что такие классы нельзя разбивать на хидеры и cpp-шники. Теперь вот знаю
В начале же объяснили всё, .h файлы чтобы не было много кода в основном файле, а вот .cpp нужно использовать чтобы избежать ошибок компоновщика(погуглите)
@@euuhgzz2791 Смысл в том, что когда объявления и реализации находятся в разных файлах, то появляется возможность не перекомпилировать весь проект при маленькой правке. То есть у тебя есть некий модуль, который используется в других модулях, если его поправить, то изменятся все модули и в больших проектах такой код можно будет час компилировать, а ты всего-то цвет кнопки хотел поменять и посмотреть че будет. 3 года прошло, понял зачем это надо было, и сейчас я занимаю крайне противоположную позицию))
@@higiro9333 на самом деле тут проблема в организации проекта и его некоторый стиль Разбивать на разные файлы имеет смысл только при глобальном разделении модулей (проектов либ) а по поводу внешних символов - это только для статической линковки, в ней все равно код нормально не скроешь, поэтому тут только статическая заглушка и dll По хорошему надо компилировать в одной единице трансляции тк не даете раскрыться компилятору, больно долго он переаллоцирует память под новую единицу - когда есть штук 50 единиц по 2-5к строк -- это очень долго - один жирный файл быстрее соберется (Апят про внешние символы прототипов - декларация) Еще хренова что компилятор при симантическом анализе учитывает только то что выше декларации вызова, простыми словами единица не является семантически модулем -- поэтому чтоб это учитывать приходиться включать каждый раз одни и те же символы прототипов - что жрет время на синтаксическом и семантическом анализе Единственно как это можно починить - переосмыслить проект и забыть навязанные стереотипы -семантически класс является модулем Поэтому класс можно использовать как комплексный модуль со статическими методами и тд. Т.е. как неймспейс но с семантикой Получается некоторый c# и довольно удобно - реализация естественно сразу пишеться без разделения символов И потом это тупа мержить в одну единицу - скомпилируется это быстро, нет лишних символов и тд, и оптимизация будет более четкой
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
спасибо БОЛЬШОЕ что нашли не заезженную тему . . . именно подобного этому мало в ЮТУБЕ - например, взаимодействие частей программы, навыки и приемы программирования, поиск программ в сети (на гит-хаб) и пр.
кто то знает как собрать из папки с файлами внутри 1 dll?
Thank you for the support i didn't anything of russian language but i understand the text, you helped me because i doesn't found examples like yours. By the way, i am mexican but doesn't matter, thanks for all!!.
So you read google translated English from machine-generated Russian and still succeeded? I say you're lucky )
Афигеть. Тут информацию на русском не достать, приходиться в английский источники лезть. А тут все наоборот XD
Большое спасибо Сергей! Вы даже не представляете, какой шикарный контент Вы создали! Купил курс на Скиллбоксе, а учусь по вашим урокам.
Лучшего контента по с++ на просто нет!
какой же кайф, когда ты объясняешь так, что я понимаю с первого раза)) Как всегда на высоте!
Спасибо! Давно ждали урок про многофайловые проекты.
Если появляется предупреждение "ISO C++ forbids converting a string constant to 'char*'", то следует написать:
void MyClass::PrintMessage(const char str[]){
std::cout
А почему эта херня вылазит?
@@gogawriter9718 Потому что "вот так записанная строка" - это const char* (её невозможно изменить) , а функция PrintMessage принимает неконстантный char* (предполагается, что его возможно изменить). Короче, когда функция не изменяет данные которые в неё передаются надо всегда приписывать const.
не забудьте в Хедере MyClass.h тоже поменять описание функции void PrintMessage(const char str[]);
Появляется*
да, либо использовать string)
Один из любимых уроков! Смотреть под кофе просто отлично! Спасибо! Просим продолжить уроки по С++. Самый интересный язык :)
Сергей спасибо за шикарный урок!
Спасибо за урок Сергей! Давно ждал урок про многофайловые проекты. Как всегда высший класс!!!
Надо иметь талант, чтобы грамотно объяснять !
Ты мастер своего дела! Спасибо за то что ты есть!
Ураааааа!!!!я ждал)Спасибо большое)
Очередное спасибо за урок.
Если бы не ты, то я бы не знаю, что делал. Огромнейшее спасибо тебе за Все уроки, смотрю и кайфую от того, что все супер-понятно)
Спасибо огромное Сергей, очень интересный урок!!!
Как же ты понятно объясняешь, спасибо от души.
Спасибо, отличный урок, все очень подробно и понятно)
Спасибо давно ждал
Серёжа!!! Дай Бог тебе здоровья! Наконец-то понятно эту тему раскрыл для себя))
Очень важный урок! Спасибо.
Дай вам боженька здоровья, уроки замечательные!!!!
Как же понятно! Спасибо.
Спасибо, за интересные уроки
Спасибо!
Спасибо за бесценный труд!)
Отличное объяснение материала, спасибо
Спасибо за урок. Хотелось бы уроки про unit тесты, лямбды и функторы
наконец-то тема про многофайловый проект, спасибо большое!!!
спасибо за отличное объяснение!
Спасибо! Очень подробно и интересно рассказываете
Как всегда на высоте! :)
Спасибо за урок!
Прекрасный урок, я бы его добавил при изучении Класса, у нас к примеру в Джава сразу учили выносить все в разные папки и каждый класс делать в отдельно созданном классе( имеется в ввиду отдельный класс в cpp с аналогией в С++)
Блин это ж супер удобно... + Смысл Инкапсуляции стал более понятный. Спасибо большое !
Привет из Караганды, я всё понял👍
Очень полезный урок. Многое стало на свои места. Спасибо!!!
Спасибо, вы мне помогли!
Спасибо большое.
Супер, спасибо!
Отлично объясняете !! Очень подробно
+
Очень важная тема, больше уроков про многофайловые проекты
Спасибо огромное) Как всегда выручаешь
Спасибо за видео.
спасибо за объяснение, всё четко и понятно. Сделай пожалуйста видел про библиотеку random и принципы ее работы.
Круто, очень хорошо обьясняешь, большое спасибо)
Спасибо)
Спасибо) Благодаря Вам понял)
Спасибо за труды. Теперь не тупо пишу в один листинг а разбиваю.
Легенда
О да, это удобно, это сладко
Почему у меня чтобы заработало нужно подключать .cpp файл, а не .h ?
Спасибо за видео, Сергей.
Не могли бы вы сделать урок про лексический анализ строк (например, как считать строку и разбить ее на составляющие, чтобы, например, написать калькулятор)
Если в строке будет простое выражение с одним действием типа 2*6.2, то можно заюзать регулярные выражения. Это намного проще и удобнее, чем писать огромный парсер (это уже для сложных математических выражений).
@@КириллГусарев-р5х Спустя четыре года я стал девопсом и поднимаю куберы, но было приятно пересмотреть ролик вновь и поностальгировать с того, с чего начинал )
@@libcurlcntrl рад за тебя)
А меня пока никуда не хотят принимать
@@КириллГусарев-р5х Как успехи сейчас?
мне кажется что вы знаете С++ лучше чем сам Страуструп.
А объясняете просто как зверь.
Спасибо!!1
Невежда, ты просто не умеешь читать.
@@Face-gz4gc почему сразу невежда?
@@cppprograms5868 чувак, ты сказал автора канала, который учился по тем же книгам создателей, умнее их
@@Face-gz4gc я сказал что "мне кажется". Придурок сам научись читать нормально.
спасибо
Лучший, красава дядь)
4:20 начало
Как включить желтые вертикальные полосы слева?
У меня студия 17-го, подчеркивает строку m.PrintMasseg("Hello World!"); а если быть точным то строку которую мы передаем "Hello World!" , ругается и пишет что не может конвертировать const char[] to char[]?
Как сделать так, что бы из дополнительного .срр файла значение при вызове функции присваивалось переменной
А разве подключение сразу двух библиотек иострим не слишком затратно по памяти ?
Во-первых спасибо за уроки они бесценны, а теперь вопрос: а нет случаем способа работать с шаблонными классами в понятии многофайлового проекта? По стандарту с++ реализацию таких классов советуют писать в самом header класса, но хотелось бы это делать в cpp. Буду очень благодарен за ответ.
Здравствуйте! Тоже ждал подобного урока, но у меня есть вопрос на который я пока не нашел ответ или пример реализации. Как использовать в cpp файле объект класса созданный в другом cpp файле.
Пример: пишу программу для устройства на микроконтроллере. Использую стороннюю библиотеку для вебсервера.
В файле init.cpp создаю объект класса: WebServer server(80); В этом файле также делаю инициализацию сервера с помощью методов данного класса, например server.begin(); и т.д.
А в основном файле main.cpp я использую методы для работы с сервером server.on(........); server.handleClient(); и т.д.
Соответственно в main.cpp мне как-то нужно достучаться до объекта server, пробовал объявлять как extern WebServer server(80); компилятор выдает multiply definition, пробовал extern WebServer server(int port); вылазит другая ошибка.
Подскажите правильный механизм. Заранее спасибо.
P.S. Если создаю объект без параметров, например Websocket socket в файле init.cpp, а в main файле: extern Websocket socket; такой объект виден в main.cpp и компиляция проходит. Я так понимаю у меня ошибка в синтаксисе - extern WebServer server(int port);
Подскажите, возможно ли как-то сделать так, чтобы директивы препроцессора тип #define работали во всем многофайловом проекте, а не только там где они были объявлены? Ну чтобы во всех файлах происходило замещение.
Например сделать отдельный файл типа конфигурационный, где через #define задать какие-то значения, а потом эти значения распространились бы на все файлы проекта.
А структуру как записывать в эти файлы?
Добрый день, спасибо за видео-урок все очень доступно и понятно.
Подскажите, пожалуйста, как можно использовать наследование классов в многофайловом проекте?
Наследуемся от exception. Главное не забивать подключить директиву препроцессора где лежит предок
class AsLesson_Exception : public exception
{
public:
AsLesson_Exception(const char *msg, int Data_State);
int Get_Data_State();
private:
int Data_State;
};
следующий анонсированный урок жду больше, в свое время пришлось пострадать)
А если я в другой компилятор использую
Atom+ плагин gpp, я сделал тоже самое, только всё в одной папке(без папки "заголовочные файлы")
у меня не находится функция из другого файла, что делать? может нужно через командную строку создать проект как-то, чтобы все нужные папки создались(например)?
А як створити йього без VS, в провіднику.
эх... Все летит с ошибкой: Undefined symbols for architecture arm64:
"Sum(int, int)", referenced from:
_main in main.cpp.o...
Дело не в арм, на Rosetta 2 тоже самое. Если не подключать файл в CmakeLists.txt, то ничего не работает, но так быть точно не должно
скорее всего .h не инициализирует cpp
@@bezik572 спустя столько лет... нашлось решение?
Спасибо за урок, не могли бы вы сделать урок на тему, "Перегрузка операторов при полиморфизме"? , а то инфо мало. Например: есть абстрактный базовый класс, A от него B, C
и при перегрузке равно B = C , результат был типа B и наооборот.
ЗДравствуйте, а что делать если пишет: undefined reference to `List_str::push_back(std::__cxx11::basic_string
Если что List_str (мой класс), push_back (метод класса) и дальше идут аргументы метода.
Кто нибудь знает что делать если при выводе строки пишет невозможно преобразовать аргумент 1 из const char[11] в char []???
Я, короч, перед char дописал const и всё заработало.
Evgenii Lucevich спасибо
дело в последних обновах VS2017,
а обязательно добавлять cpp файл? просто я делал без cpp и у меня всё было норм
А 138-й урок существует?
Посмотрел и расстроился 😢
Как оказывается много чего не знаю
Чего расстраиваться, наоборот, если не знал, то это крутая и не сложная инфа, которую приятно узнать
вместо - PrintMessage(char str[]);, нужно писать - PrintMessage(const char *str);
лайк с двух аккаунтов)
Большое спасибо, за помощь бедным студентам))0
Делала всё, как в видео, но почему-то среда разработки в упор не видит cpp файла с реализацией :(
Nataly Sammet visual studio code? Macos?
@@MashkaShow К счастью, я нашла решение :) Дело в том, что я занималась реализацией шаблонного класса - тогда ещё не знала, что такие классы нельзя разбивать на хидеры и cpp-шники. Теперь вот знаю
Зачем в файле Sum.cpp делать include Sum.h. И без этого инклюда всё прекрасно работает.
Лайкнул - посмотрел - раскидал по месенджерах. Что за 8-битная музычка на фоне тихонько так играет?
Demise - Ethan Meixsell
А как насчёт hpp
А это не тот же .h?
кто то знает как собрать из папки с файлами внутри 1 dll?
Сергей индивидуальные уроки не проводите?
Сейчас нет.
а когда будут курсы по с#
cool
Я как раз тот случай. Начал писать ардуино умный дом на с++ и у меня 1500 строк кода. И это пизд..ц. Вот я тут
не понятно зачем нужна 2 файла cpp и h? зачем в h писать пустую функцию а в cpp описанную?
В начале же объяснили всё, .h файлы чтобы не было много кода в основном файле, а вот .cpp нужно использовать чтобы избежать ошибок компоновщика(погуглите)
Время доброе! #вопрос : как отделить реализацию шаблонного класса от хедера? Я немножко порылся в сети, ничего дельного и красивого не обнаружил.
Просто для апа
Комментарий
+
Сергей обещаю,когда стану разработчиком,тебе задоначу половину своей первой зарплаты)
Ну как успехи?
так многие говорили ....
Стал?
Нахуя тут так сложно придумали?? Почему нельзя по нормальному залить один файл в другой без всяких там заголовков, прототипов и тд..
согл
@@euuhgzz2791 Смысл в том, что когда объявления и реализации находятся в разных файлах, то появляется возможность не перекомпилировать весь проект при маленькой правке.
То есть у тебя есть некий модуль, который используется в других модулях, если его поправить, то изменятся все модули и в больших проектах такой код можно будет час компилировать, а ты всего-то цвет кнопки хотел поменять и посмотреть че будет.
3 года прошло, понял зачем это надо было, и сейчас я занимаю крайне противоположную позицию))
@@higiro9333 на самом деле тут проблема в организации проекта и его некоторый стиль
Разбивать на разные файлы имеет смысл только при глобальном разделении модулей (проектов либ)
а по поводу внешних символов - это только для статической линковки, в ней все равно код нормально не скроешь, поэтому тут только статическая заглушка и dll
По хорошему надо компилировать в одной единице трансляции тк не даете раскрыться компилятору, больно долго он переаллоцирует память под новую единицу - когда есть штук 50 единиц по 2-5к строк -- это очень долго - один жирный файл быстрее соберется
(Апят про внешние символы прототипов - декларация) Еще хренова что компилятор при симантическом анализе учитывает только то что выше декларации вызова, простыми словами единица не является семантически модулем -- поэтому чтоб это учитывать приходиться включать каждый раз одни и те же символы прототипов - что жрет время на синтаксическом и семантическом анализе
Единственно как это можно починить - переосмыслить проект и забыть навязанные стереотипы -семантически класс является модулем
Поэтому класс можно использовать как комплексный модуль со статическими методами и тд. Т.е. как неймспейс но с семантикой
Получается некоторый c# и довольно удобно - реализация естественно сразу пишеться без разделения символов
И потом это тупа мержить в одну единицу - скомпилируется это быстро, нет лишних символов и тд, и оптимизация будет более четкой
Спасибо что объяснил @@higiro9333
может сменишь уже музло)
приелся уже запил)
Можете подсказать объяснить, почему нельзя написать определение (реализацию) функции в хедере?
Можно, но скорее всего он был создан чтобы только оглашать.
ЗДРАВСТВУЙТЕ УРОК 138 НЕ МОГУ НАЙТИ 137 СЛЕДОМ ИДЕТ 139 ПОСЛЕ БИБЛИОТЕК STL !
он идет после 9 урока STL
Спасибо!
Спасибо большое!
спасибо