Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Начал изучать C++

Сообщение Trully »

Добра всем.
Приступил к изучению C++. Появились коекакие размышления. Первое с чем столкнулся при создании проекта - Reduced C, Reduced C++. Покачто не понял в чем там дело и чем конкретно отличается от Standart. Оставил на потом.
Познакомился с понятием классов, объектов, методов. Посмотрел как это лежит в памяти. Разобрался с наследованием классов. Прикольная штука особенно protected. Это то чего не хватало в С.
Что не понравилось - чтобы вызвать функцию из класса нужно сначала создать объект. Возможно есть какието другие способы. Слышал про шаблоны функций но пока до них не дошел. Возможно там есть ответы на мои вопросы.
Про конструкторы понятно. А вот что с деструкторами, когда они вызываются и что в них нужно писать применительно к микроконтроллерам это пока не понятно. Создал класс и объект - конструктор вызывается, а вызова деструктора не видно. Еще надо разобраться с множественными наследованиями ибо это архиважная вещь.
Перегрузка функций прикольная штука но пока не понятно насколько она реально востребована, ведь приходится в голове держать то что имя одинаковое но список параметров разный.
Пока еще не пробовал чето конкретное делать. Только на отвлеченных примерах типа a+b, x+y. Потому еще не очень понимаю как это все будет на практике ложиться. Там в списке глав еще много пунктов есть я так смотрю. Но все по порядку.
to be or not to be = -1
Реклама
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

чтобы вызвать функцию из класса нужно сначала создать объект.
Создайте статическую функцию в классе и вызывайте её без создания объекта.
Создал класс и объект - конструктор вызывается, а вызова деструктора не видно.
Деструктор вызывается при уничтожении объекта.
Еще надо разобраться с множественными наследованиями ибо это архиважная вещь.
Вообще лучше не используйте. Это антипаттерн в большинстве случаев. Но что такое виртуальное наследование посмотрите. :)
Разобрался с наследованием классов. Прикольная штука особенно protected. Это то чего не хватало в С.
Это используйте по-минимуму. Лучше аггрегация, чем наследование. :)
Перегрузка функций прикольная штука но пока не понятно насколько она реально востребована, ведь приходится в голове держать то что имя одинаковое но список параметров разный.
Используется для своих целей. А так, IDE должна подсказывать варианты. Не подсказывает? Плохая IDE.
Там в списке глав еще много пунктов есть я так смотрю. Но все по порядку.
stl посмотрите. :) Но не запускайте на микроконтроллерах. :-D
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Реклама
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопросы по С/С++ (СИ)

Сообщение Trully »

Благодарю за ответы.
Про статическую функцию - попробовал, самое то. Хорошо. Но конструктор при этом уже не вызывается. Логично - нет объекта нет и конструктора.
Про деструктор - это понятно, что он вызывается при удалении объекта. Но вот как удалить объект и что писать в деструкторе - освобождение памяти? - это пока не понятно. Возможно это в операционных системах востребовано. А пока что если объект создан, его фиг удалишь из памяти. Разве при динамическом выделении памяти как в С через malloc. Возможно я еще просто не дошел до таких тонкостей.
До virtual только что добрался в прочтении. Однако как я понял, это несколько иное. Множественное наследование обеспечивает иерархию подключений. В virtual пока еще только вникаю, пробую пробовать на примерах. Агрегация? Пока еще не знаю что это такое. Я еще мыслю масштабами Си.
IDE должна подсказывать варианты. Не подсказывает?
Подсказывает! :)) я даже не успеваю еще подумать а она уже подсказывает.

В общем сейчас нахожусь как раз на стадии чтения и пробования.
to be or not to be = -1
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="Trully",url="/forum/viewtopic.php?p=3685649#p3685649"]До virtual только что добрался в прочтении.[/uquote]
Что хоть за книга? Если там какой-нибудь С++03, то считай что читаешь описание половины языка :)
Реклама
Эиком - электронные компоненты и радиодетали
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопросы по С/С++ (СИ)

Сообщение Trully »

Читаю вот это http://www.c-cpp.ru/books/dlya-chego-nu ... ye-funkcii и вот это http://cppstudio.com/cat/274/ . Даже если это всего половина языка то мне пока хватит для того чтобы написать свой первый холлоуворлд на С++. Сами ведь знаете, что для того чтобы что то изучить надо вначале вникнуть в основы а потом уже копаться в тонкостях.
to be or not to be = -1
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Trully писал(а):Но вот как удалить объект
Самое простое - если объект создан на стеке внутри некоей области видимости (например, внутри фигурных скобок в if() {} или типа того). После выхода из этой области объект уничтожается и вызовется деструктор.
Реклама
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

Но вот как удалить объект и что писать в деструкторе - освобождение памяти?
Объект удаляется как обычная переменная - при выходе из области видимости (не относится к объектам, созданным в куче, т.е. через new). У вас, видимо, объект глобальный, вот и не удаляется. Создайте его как локальную переменную. В деструкторе вы пишете то, что считаете нужным. Выделяли память? Освобождаете. Открывали файл? Закрываете. Ну и так далее.
Разве при динамическом выделении памяти как в С через malloc.
Никогда не создавайте объекты иначе, чем через new. И не удаляйте иначе, чем через delete. С квадратными скобками delete[](имя массива объектов), если выделяли массив объектов - это важно. Иначе получите вызов деструктора только для первого объекта массива. Исключение составляют всякие умные указатели - они сами удалят объект или массив. Но это уже stl.
В virtual пока еще только вникаю, пробую пробовать на примерах.
При наследовании через virtual в класс добавляется не сам класс, от которого унаследовано, а ссылка на него. Таким образом, при множественном ромбовидном наследовании у вас не окажется у каждого класса, от которых вы унаследовались свой экземпляр базового класса (суперкласса).
Агрегация? Пока еще не знаю что это такое.
Вот тут посмотрите. :) https://habr.com/ru/post/354046/

И очень важно: обязательно посмотрите на полиморфизм и концепцию интерфейсов. Это крайне важная вещь. Не наследование (исключая наследование от интерфейса), а полиморфизм вам пригодится больше всего.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопросы по С/С++ (СИ)

Сообщение Trully »

Угу, пошел читать. Похоже что С++ идеологически сложнее Си.
Про видимость переменной объекта - я создавал их все в main без вложенностей. Пробовал и глобальный объект тоже. Теперь понятно почему не получалось с деструктором. А про то как работает стек это я хорошо знаю еще с чистого Си, с этим проблем нет.
to be or not to be = -1
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопросы по С/С++ (СИ)

Сообщение BOB51 »

Вообще-то С++ относительно микроконтроллеров - это ардуино IDE...
Хотя там для начала весьма мало о том оговорено...
Приходится самому мозги ломать...
https://radiokot.ru/forum/viewtopic.php ... 4#p3680734
МНДЯАА...
8)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

BOB51 писал(а):Вообще-то С++ относительно микроконтроллеров - это ардуино IDE...
:facepalm:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопросы по С/С++ (СИ)

Сообщение Trully »

В Ардуино не лезу по политическим соображениям уж извините. И кто из рядовых пользователей в Ардуино когда нибудь писал сам классы? Кажись там все только в маин пишут вызовы функций из скетчей и все. Как мне кажется даже разработчики скетчей для Ардуино не утруждаются дальше простого создания базовых классов и методов в нем.
to be or not to be = -1
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Вопросы по С/С++ (СИ)

Сообщение jcxz »

[uquote="Trully",url="/forum/viewtopic.php?p=3685649#p3685649"]Но вот как удалить объект и что писать в деструкторе - освобождение памяти? - это пока не понятно.[/uquote]
Деструктор не освобождает память занятую объектом. Он не для этого. Он только разрушает объект.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопросы по С/С++ (СИ)

Сообщение BOB51 »

Trully Гляньте по ссылке.
Я как раз разборкой с теми классами и выносом фрагментов за пределы основного файла *.ino и разбираюсь.
Только вот никито из ГУРУ (за исключением Ser60 да Reflector) в том рассмотрении так и не поучаствовали (в полезном смысле)...
А таки вопрос весьма интересный.
И классы и работа с оными ПОДДЕРЖИВАЕТСЯ (правда за счет чего там - не мне разбираться спецкаталог за 4 гига в скрытых папках).
8)
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Вопросы по С/С++ (СИ)

Сообщение jcxz »

[uquote="da-nie",url="/forum/viewtopic.php?p=3685708#p3685708"]Никогда не создавайте объекты иначе, чем через new. И не удаляйте иначе, чем через delete.[/uquote]
Почему это?
Для embedded я бы наоборот рекомендовал - никогда не создавать объектов через new.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

[uquote="jcxz",url="/forum/viewtopic.php?p=3686044#p3686044"][uquote="Trully",url="/forum/viewtopic.php?p=3685649#p3685649"]Но вот как удалить объект и что писать в деструкторе - освобождение памяти? - это пока не понятно.[/uquote]
Деструктор не освобождает память занятую объектом. Он не для этого. Он только разрушает объект.[/uquote]имхо, вы объяснили так, что ничего не понять.

назначение деструктора - освободить память, которую выделял для своих нужд объект, например, в конструкторе. ну и иногда сделать какие-то дополнительные "предсмертные" действия
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Вопросы по С/С++ (СИ)

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=3686049#p3686049"]назначение деструктора - освободить память, которую выделял для своих нужд объект, например, в конструкторе. ну и иногда сделать какие-то дополнительные "предсмертные" действия[/uquote]
Не обязательно память. Что угодно может освобождать и что угодно другое делать. Вот только память, занятую самим объектом, он не освобождает. О чём я и написал.
Эта память освобождается после завершения работы деструктора, отдельно. Или вообще не освобождается.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

ну я не знаю, что еще в программировании, кроме памяти, можно освобождать :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

jcxz, Для МК с ограниченным объемом памяти я предпочитаю C, а не C++. Потому как C++ без STL большого смысла не имеет, а с STL - в такие МК все равно не лезет.

По теме. Деструктор освобождает ресурсы, которые были тем или иным образом захвачены при инициализации объекта и при вызове его методов. В частном случе, особенно на МК без ОС - это дополнительно выделенная память. В случае RTOS - это могут быть, например, семафоры или очереди.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

ПростоНуб писал(а):В случае RTOS - это могут быть, например, семафоры или очереди.
можно подумать, что семафоры или очереди - не память :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: Вопросы по С/С++ (СИ)

Сообщение ПростоНуб »

ARV, Если объект захватил ранее созданный кем-то семафор, то деструктор объекта должен только освободить семафор, но вовсе не удалять его.
Ответить

Вернуться в «Разные вопросы по МК»