|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
|
Как правильно использовать существующий объект одного класса в описании другого класса?01.09.2021, 23:51. Показов 4608. Ответов 24
Метки нет (Все метки)
Я учусь использовать С++ для программирования микроконтроллеров.
И не могу понять, как выстроить правильно логику программы на С++ Расскажу на конкретном примере. Допустим, я создал класс для обработки данных поступающих с UART (последовательный порт) Класс представляет собой кольцевой буфер и несколько методов для работы с ним. Методы самые простые: сохранить байт в буфер, вытащить байт из буфера, проверить буфер на пустоту, очистить буфер и т.д. На основе класса я создал объект. И проблема в том что этот объект должен быть только один, а использоваться он должен во всей программе в том числе и в других классах. Объектом кольцевого буфера я пользуюсь и в прерывании (что бы положить туда пришедший байт) и в программе (например, для проверки его пустоты), а так же в классе для обработки сообщений и в некоторых других классах. То есть, существующий объект должен использоваться как самостоятельно, так и в составе других классов. К примеру, я хочу создать класс обработки принимаемых данных и в этом классе мне нужно как-то организовать взаимодействие с уже существующим объектом кольцевого буфера. Наследование, дружба не вариант, так как при этом создастся еще один объект кольцевого буфера, а это не допустимо. Получается, что если я создаю класс, где нужно как то взаимодействовать с буфером, то прямо в описании класса мне нужно использовать уже существующий объект. Но, на сколько я понимаю, описание класса не должно каким-либо образом ссылаться на уже созданный объект. Или такое допустимо? Как быть в таких ситуациях?
0
|
|
| 01.09.2021, 23:51 | |
|
Ответы с готовыми решениями:
24
Объявление объекта одного класса в описании другого класса
|
|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
|
| 02.09.2021, 20:37 [ТС] | |
|
Этот синглтон такая мутная хрень с которой и связываться не хочется. Уж лучше я буду использовать статические методы и поля.
Вообще, я крайне был удивлен, что оказывается несмотря на бешеную популярность С++ под микроконтроллеры в виде Ардуино, нет качественного решения таких часто встречающихся ситуаций. Почти в любом проекте на С++ под микроконтроллеры возникает необходимость создать единственный класс и получать доступ к нему из других классов. Синглтон, пожалуй, буду в последнюю очередь использовать. Есть еще вариант передавать в конструктор класса ссылку на существующий класс. Тоже, вроде, неплохое решение. На крайний случай, статические поля с методами. А на самый крайний вообще отказаться от классов в таких случаях и делать все на обычных функциях как на Си.
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 02.09.2021, 23:19 | ||
|
Добавлено через 5 минут Проблема с синглтоном только в том, что если в программе будешь общаться не с одним, а например с двумя уартами, то придётся перестраивать программу (и вместо синглтона делать "фабрику" - промежуточный класс, который будет управлять созданием и удалением портов).
0
|
||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
|||
| 03.09.2021, 10:52 | |||
|
Синглтон служит для решения сопутствующих вопросов. А если вам это все не нужно, то - глобальная переменная и готово.
0
|
|||
|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
|||
| 03.09.2021, 11:55 [ТС] | |||
|
Но, проблема то не в этом, а в том, как созданный объект использовать в других классах. А объект класса, конечно, нужно сделать глобальным, если он требует доступа из других файлов. В общем, для себя я решил, что лучшим вариантом будет создать объект, сделать его глобальным при помощи extern в заголовочном файле. А что бы объект можно было использовать в других классах, передавать его как ссылку в конструктор того класса, в котором я хочу его использовать. Сейчас тестирую такой способ.
0
|
|||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 03.09.2021, 12:09 | |
|
reti, а вы не пробовали почитать про singleton о котором вам говорят?
0
|
|
|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
||
| 04.09.2021, 11:03 [ТС] | ||
|
1. Я плохо понимаю как он работает, значит пока его использовать не буду. 2. Самое главное. Ни разу не видел, что бы кто-то его использовал в программировании Arduino. Значит, есть другие более корректные варианты.
0
|
||
|
фрилансер
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,008
|
|
| 04.09.2021, 11:05 | |
|
reti, выше уже написали про глобальную переменную - это удобнее синглтона
0
|
|
|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
||
| 04.09.2021, 11:26 [ТС] | ||
|
Под глобальной переменной вы имеете в виду глобальный объект? Глобальная переменная это переменная которая определена вне всяких функций (или классов, если С++) и к ней можно получить доступ из разных функций программы. Глобальными переменными в программировании микроконтроллеров я пользуюсь часто, как и многие другие программисты. Это позволяет очень удобно обмениваться данными между функциями. Аналогичным образом я хочу использовать созданный объект на С++. Его я тоже хочу сделать глобальным, что бы из любой точки программы обратиться к открытым методам или полям. А проблема в том, что я хочу создать еще несколько классов в которых я хочу использовать УЖЕ СОЗДАННЫЙ объект. Получается, в описании класса мне нужно ссылаться на конкретное имя созданного объекта, что бы его использовать в этом классе.
0
|
||
|
фрилансер
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,008
|
||||||
| 04.09.2021, 11:34 | ||||||
|
reti, так в чём именно сложность?
делаешь заголовочник, в нём пишешь класс глобальной переменной и объявляешь саму переменную CMyGlobalVar.h
CMyGlobalVar.hP.S. Если компилятор не поддерживает C++11 и выше, то данный пример можно переписать на более древний стандарт - не так красиво, но работать будет так же Добавлено через 2 минуты правда, есть один момент, из-за которого синглтон более приемлим: порядок инициализации глобальных переменных до входа в main может быть произвольным. То есть, данный объект не следует использовать в конструкторах классов других глобальных переменных
0
|
||||||
|
Just Do It!
|
|||||||
| 04.09.2021, 11:54 | |||||||
0
|
|||||||
|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
|||||||||||||||||||||||
| 04.09.2021, 12:02 [ТС] | |||||||||||||||||||||||
|
Создаю структуру или класс:
А ВОТ ДАЛЬШЕ Я НЕ ЗНАЮ КАК ТОЧНО ПОСТУПАТЬ В ТАКИХ СИТУАЦИЯХ: Хочу сделать класс для обработки поступивших сообщений
0
|
|||||||||||||||||||||||
|
фрилансер
6446 / 5642 / 1128
Регистрация: 11.10.2019
Сообщений: 15,008
|
||
| 04.09.2021, 12:08 | ||
|
Либо в конструктор класса class treatMessage передай ссылку на объект BufferUart (и сделай поле-ссылку в классе), тогда переменная может быть и не глобальная, а просто объявленная в main
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 04.09.2021, 12:17 | ||
|
Передавать можно вызовом функции этих использующих, а можно и просто заданием поля с указателем в них (но так хуже).
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||
| 04.09.2021, 12:26 | |||
Добавлено через 4 минуты
0
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 04.09.2021, 12:46 | ||
|
0
|
||
|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
||
| 04.09.2021, 12:49 [ТС] | ||
|
При программировании встраиваемых систем очень часто нарушаются правила ООП. Без этого программы будут медленными, а памяти и вовсе может не хватить. После того как начал погружаться в философию ООП пришлось в голове перестраивать привычные шаблоны мышления при составлении программ. И вот такая ситуация, когда по сути описание класса зависит от имени конкретного объекта, вызывает у меня противоречивые чувства. С одной стороны, вроде, так работает, но с другой стороны как то слишком грубо, нарушаются основные концепции ООП. Поэтому подумал, что существует какое-то более элегантное решение. Ну если так тоже Ok, то приму к сведению.
0
|
||
| 04.09.2021, 12:49 | |
|
Помогаю со студенческими работами здесь
20
Можно ли объявлять в описании одного класса объекты другого класса Ошибка при попытке использовать объект класса в определении другого класса Передача конструктору одного класса объект другого класса При перегрузке оператора для класса не получается использовать имя переменной такое же, как в описании класса Как из одного объекта получить объект другого класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|