|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
|
Как правильно использовать существующий объект одного класса в описании другого класса?01.09.2021, 23:51. Показов 4707. Ответов 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
|
||
|
Вездепух
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,235
|
|||
| 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
|
||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
|
|
| 04.09.2021, 11:05 | |
|
reti, выше уже написали про глобальную переменную - это удобнее синглтона
0
|
|
|
6 / 6 / 1
Регистрация: 13.12.2017
Сообщений: 22
|
||
| 04.09.2021, 11:26 [ТС] | ||
|
Под глобальной переменной вы имеете в виду глобальный объект? Глобальная переменная это переменная которая определена вне всяких функций (или классов, если С++) и к ней можно получить доступ из разных функций программы. Глобальными переменными в программировании микроконтроллеров я пользуюсь часто, как и многие другие программисты. Это позволяет очень удобно обмениваться данными между функциями. Аналогичным образом я хочу использовать созданный объект на С++. Его я тоже хочу сделать глобальным, что бы из любой точки программы обратиться к открытым методам или полям. А проблема в том, что я хочу создать еще несколько классов в которых я хочу использовать УЖЕ СОЗДАННЫЙ объект. Получается, в описании класса мне нужно ссылаться на конкретное имя созданного объекта, что бы его использовать в этом классе.
0
|
||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
|
||||||
| 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
|
|||||||||||||||||||||||
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
|
||
| 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
Можно ли объявлять в описании одного класса объекты другого класса Ошибка при попытке использовать объект класса в определении другого класса Передача конструктору одного класса объект другого класса При перегрузке оператора для класса не получается использовать имя переменной такое же, как в описании класса Как из одного объекта получить объект другого класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|