|
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
|
Как инициализировать статические переменные класса если они в привате?08.09.2021, 19:38. Показов 3504. Ответов 20
Метки нет (Все метки)
Собственно я решил потренировать свои навыки в ООП и для этого создал себе задачу сделать некий класс для управления насосами. Насосы , их может быть много, они могут качать могут не качать.
Я захотел сделать так чтобы все управление насосами шло полностью через свойства объекта(не силен в терминологии имею ввиду что все доступно через точку) Вот что получается: Насос: имеет свой номер, имеет статус(качает или не качает) Количество насосов это статическая переменная. Каждый объект с помощью конструктора увеличивает эту переменную хранящую количество насосов на единицу. Ее можно посмотреть но нельзя менять. То есть чтобы узнать количество насосов нужна статическая функция. Потому что среди модификаторов доступа в классе в С++ нет такого варианта чтобы снаружи можно было читать но нельзя было менять. Возникает проблема , а как собственно инициализировать нулем количество насосов? Оно же лежит в привате а туда никак не залезть никому снаружи. А изнутри нет "статического конструктора" одного для всех экземпляров. Далее возникает следующая проблема. Хотелось бы иметь статическую функцию которая может посылать сообщения всем обьектам : " всем стоять", " все качайте", "дайте список тех кто работает", Чтобы это сделать, нужно создавать статический-динамический список ссылок на все насосы например вектор содержащий указатели в который каждый объект при своем создании добавит ссылку на себя. ( а как он может потом себя удалить будет искать нужную ссылку в векторе по значению?) В общем вопрос как весь этот ООП зоопарк загнать в один класс используя С++? Ведь это как мне кажется классическая задача ооп в геймдеве, там тоже юниты плодятся тысячами и им даются команды типа " все упали от взрыва" или кто ближе 100 метров к взрыву у того отлетели уши.
0
|
|
| 08.09.2021, 19:38 | |
|
Ответы с готовыми решениями:
20
Как инициализировать статические члены класса Как правильно инициализировать статические поля класса Как правильно инициализировать статические члены класса? |
|
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
|
|
| 08.09.2021, 19:41 | |
|
unsigned Насос::моя_статическая_переменная = 0;
0
|
|
|
фрилансер
6437 / 5632 / 1126
Регистрация: 11.10.2019
Сообщений: 14,971
|
|||||||
| 08.09.2021, 19:57 | |||||||
|
Святогор, так пойдёт ? )
0
|
|||||||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 08.09.2021, 20:02 | ||
|
0
|
||
|
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
||||||
| 08.09.2021, 22:01 [ТС] | ||||||
|
Ну вот:
include\Pumps.h|14|error: ISO C++ forbids in-class initialization of non-const static member 'Pumps::quontity'| если const убрать тогда компилирует иначе никак.
0
|
||||||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 08.09.2021, 22:12 | ||
inline. А без inline, еще раз: инициализатор указвается определении. Где ваше определение?
0
|
||
|
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
|
| 08.09.2021, 22:20 [ТС] | |
|
Не понял. А что такое определение? Я думал вы имеете в виду объявление переменной, я ее объявил. А что ещё нужно?
0
|
|
|
Заблокирован
|
|||
| 08.09.2021, 22:21 | |||
|
Святогор, А это для кого писалось ? 8 пост
Непонятно зачем статическое поле для количества насосов ? Также непонятно желание кому то извне системы управления насосами изменять это поле ? Зачем насосу удалять самого себя с системы?
0
|
|||
|
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
||
| 08.09.2021, 22:45 [ТС] | ||
|
цитата: "Непонятно зачем статическое поле для количества насосов ?
(re: как же на этом форуме цитировать то? Ни кнопки нет ни надпсиь при выделении не появляется) Также непонятно желание кому то извне системы управления насосами изменять это поле ?" Как зачем статическое поле? А где хранить количество насосов? Для этого и нужны статические переменные чтобы для любого объекта из класса они были бы одной и тойже переменной. Конструктор увеличивает счетчик экземпляров на единицу а деструктор уменьшает и благодаря этому мы всегда знаем сколько есть насосов. Зачем статический метод? Чтобы я мог сделать вот так: cout<<Pumps::quontity; Тоесть получить количество всех насосов. Добавлено через 4 минуты А может поясните почему нужно так делать и где можно почитать об этом?
0
|
||
|
Модератор
|
|||
| 08.09.2021, 22:52 | |||
|
0
|
|||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||||||||
| 08.09.2021, 23:00 | ||||||||
Сообщение было отмечено Святогор как решение
РешениеОпределение делается отдельно
1
|
||||||||
|
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
|||||
| 08.09.2021, 23:14 [ТС] | |||||
|
типа так: Pumps::all_turn_OFF; Pumps::all_turn_ON; Этот статический метод имея конечно же статический вектор ссылок на объекты сам их все переберёт и включит каждый насос. Зачем насосу самому удалять себя из системы? Как зачем? Я этому насосу даю сообщение запустив метод Pump.delete(); и он выключается и удаляет себя из статического списка насосов, больше никто на него не надеется и не учитывает в работе. Может он сломался например или вообще его демонтировали и он не нужен. В принципе все сводится к тому же вопросу, как правильно разводить зоопарк каких нибудь сущнойстей, будь то насосы, танки или юниты, чтобы потом знать их количество и рассылать им всем массовые и индивидуальные команды. Обычно в учебникак пишут мол сделайте динамический список ваших экземпляров и потом перебирайте его либо какой-то специальный интерфейсный класс который предназначен чтобы пасти и регестрировать все эти объекты. Я думал это распространенная задача и все кроме меня знают как это делать. Добавлено через 12 минут Вот только чтобы узнать через обычный геттер вам надо гдето взять ссылку на любой объект из класса и у него запустить этот метод а при статическом методе вам не нужно знать ничего вы просто обращаетесь к классу и не занимаетесь никаким поиском ссылок на объект. Согласитесь удобнее.
0
|
|||||
|
Заблокирован
|
||
| 08.09.2021, 23:28 | ||
|
Святогор, статическое поле будет одно и то же для всех объектов данного класса.
Допустим у тебя два разных менеджера насосов. У них статическое поле Так же статические метод это просто функции, не являющиеся собственностью класса, и могут оперировать лишь статическими полями. Добавлено через 24 секунды Если ты этого не знал, вот те сюрприз. Добавлено через 1 минуту Статические переменные-члены класса Добавлено через 24 секунды Это для ликбеза, подробнее читай в справочниках.
0
|
||
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 08.09.2021, 23:35 | ||
|
Для статического поля требуется отдельное определение.
0
|
||
|
Модератор
|
||||||
| 08.09.2021, 23:35 | ||||||
|
Святогор, Вот вы такое хотите?
1
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 09.09.2021, 00:09 | ||||||||
|
- "кто о ком знает" ? - "кто кем владеет" ? принцип хорошо организованной архитектуры: - чем меньше одни классы знают о других, тем лучше. - класс должен решать только одну единственную задачу, ради которой он был создан что бы насос смог удалить сам себя, он должен знать о среде в которой существует. это - совершенно не нужное знание, которое зазря усложнит конструкцию. насос был создан для того, что бы сосать. и только это он и должен уметь делать. за хранение/создание/удаление должен отвечать специально предназначенный для этого контейнер. например: std::vector, который и был разработан специально для этой цели. если тебе нужна какая то высокоуровневая абстракция: "насосная станция", которая должна управлять множеством насосов, значит возьми и создай отдельный класс, который так и назови: "насосная станция" например, насосная станция будет уметь добавать/удалять насосы, а так же включать и выключать их. а вот самим насосам совершенно не нужно ничего знать ни о каких векторах, и ни о каких насосных станциях. таким образом, код будет простым, логичным и понятным. все узлы архитектуры заняты только своей собственной маленькой задачей: https://rextester.com/NZCX41406
2
|
||||||||
|
17 / 18 / 4
Регистрация: 27.06.2016
Сообщений: 236
|
|
| 28.09.2021, 12:46 [ТС] | |
|
Я понял о чем вы говорите. Сама мысль о том что должен существовать статический метод навеяна мне программированием на c# в dot net . Там есть такой компонент -серийный порт(serial port) , вы его создаете настраиваете и используете для связи.
Так вот , для того чтобы узнать список доступных портов там используется статический метод. Вот я и подумал раз сам майкрософт использует такой способ , то наверное это очень круто и так всегда надо делать. И выглядит это вполне удобно. В самом деле как бы это выглядело если бы они ещё создали класс который будет диспетчером серийных портов и будет их создавать. В общем я сделал вышеописанную задачу двумя способами: и с классом "станция" который создает и управляет насосами и со статическими методами и встроенным статическим списком. Если развивать дальше идею с некоторыми абстрактными насосами, то возникает следующие проблемы: - Как сделать так чтобы насосы можно было передавать от одной станции в пользование к другой? При этом он не должен потеряться, его нужно удалять только после того как его получила другая станция. - Если уничтожить все станции то возникает вопрос а где при этом будут насосы? Вообще если насосы не могут существовать без станции это выглядит не логично. Получается нужен ещё какой-то промежуточный регистрационный класс в котором точно будут зарегистрированы все насосы и именно в нем они создаются выделяются для отправки в станции и уничтожаются. Ещё дальше возникает потребность давать не точные команды насосным станциям типа вот таких: - "включить три каких нибудь насоса" и это не должны быть какие-то определённые насосы и не просто с начала списка ,а рандомные. Делается это из соображений равномерного расхода их механического ресурса. - вывести 5 насосов из работы и передать их из станции в общий ресурс. Вообще проблема описанная в заглавии темы решена за что всем спасибо, дальнейшее обсуждение это уже качается принципов ООП.
0
|
|
|
Заблокирован
|
||||
| 28.09.2021, 14:50 | ||||
|
0
|
||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
||||||
| 28.09.2021, 16:28 | ||||||
|
Иногда рефлексия нужна, например, в играх, и хорошо бы иметь понимание, как её строить.
Простейший пример с иерархией классов и простейшим поиском по сущностям.
0
|
||||||
|
Заблокирован
|
|
| 29.09.2021, 12:18 | |
|
lemegeton, ну єто совсем другой разговор
![]() Желаю автору разобраться. Добавлено через 57 секунд Но хранить указатели как идентификатор обїекта не самій лучший вариант....
0
|
|
| 29.09.2021, 12:18 | |
|
Помогаю со студенческими работами здесь
20
Как при создании экземпляра класса инициализировать переменные вложенного класса Не могу инициализировать переменные класса Где инициализировать переменные класса? Как инициализировать переменные?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1
У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\
А в самом низу файла-профиля. . .
|