|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.03.2018, 23:44 | #1 |
Регистрация: 20.03.2018
Сообщений: 7
|
Массив экземпляров класса - как правильно создавать?
Всем привет.
После стольких лет добрался-таки до Плюсов. Раньше меня отпугивал сишный синтаксис, поэтому если что и делал, то на Фрипаскале. Ну, как делал... Раз в год на пару недель нападала хандра, начинал писать простенькие игрушки, коими развлекал домашних. По сути всё моё увлечение программированием сводится к тренировке мозгов, чтобы не застывали. Так я вообще не программист, а музыкант по профессии. В общем, вступление закончено, теперь суть. Недавно на фрипаскалевском форуме мне эту проблему помогли решить, но вот как оно правильно делается в С++ - не понимаю. Есть класс. Есть массив экземпляров класса. Есть другой класс и массив его экземпляров. Когда что-то делаю только с первым массивом, всё вроде бы хорошо (хотя я подозреваю, что на самом деле нет). Но вот в момент появления второго массива программа начинает глючить или вообще падает, в зависимости от количества элементов. Я так понял, что экземпляры класса внутри массива надо как-то инициализировать... В общем, вот код. При запуске сначала всё хорошо, но как только один из "кораблей" пытается "выстрелить"(в случайный момент), вот тут-то и начинается безумие. Что я делаю не так? Как сделать правильно? Код:
— Доктор, меня не понимают...
— вРН БШ ЯЙЮГЮКХ? |
21.03.2018, 04:44 | #2 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
1. Экземляры класса (в т.ч. внутри массивов) инициализируются конструктором класса. Т.о. у вас там уже 100 объектов инициализированых конструктором по умолчанию.
2. Так вобщем нифига не эффективно делать. Т.к. эти массивы будут на стеке. А стек обычно пренебрежительно мал. Скажем, в линукс по умолчанию 2мб на поток. В мак-ос 512кб. Каждое число double требует 8 байт + выравнивание и т.д. 3. В игровом процессе было бы сделать целесообразно массив указателей (а точнее, класс-контейнер указателей, типа std::vector). Указатели ессно не обычные, а std::shared_ptr, т.к. они автоматически почистят память (типа сборщик мусора). Вот тогда да, каждый элемент такого массива нужно будет инициализировать путем выделения памяти для объекта класса, который инициализиуется своим конструктором. 4. Еще круче для игр, сделать пул объектов (указателей), например 1000 при старте. Из него брать нужное число и добавлять в текущее игровое, а потом вместо удаления - возвращать в пул. Удаление выполнять по завершении программы (или std::share_ptr позаботится сам). Это позволит избежать медленого выделения памяти. Использование указателей работает в разы быстрее, т.к. вместо полного копирования объекта (что кстати не всегда допустимо) например Код:
Ну и потом, а не выходите ли вы за границы массива? Я там в упор проверок не вижу, что numblast не превышает размер массива. 5. Для вашей цикличной структуры хорошо бы пошло std::queue вместо массива. https://habrahabr.ru/company/infopulse/blog/194726/ Последний раз редактировалось alexzk; 21.03.2018 в 05:03. |
21.03.2018, 09:12 | #3 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
взять движок типа Unity и делать игры, а не велосипеды Вообще я не вижу особого смысла брать С++ и даже Фри Паскаль если Я бы взял что-нибудь намного более высокоуровневое типа Питона или хотя бы C#/.NET, чтобы не тратить кучу времени непонятно на что вместо решения самой задачи (например даже описанная тут проблема о необъяснимом "безумии" происходит там намного реже + проще отлаживать). С++ обычно берут из-за производительности или когда нет другого выбора (уже существующий древний проект и т.п.), вряд ли у вас такие проблемы.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
21.03.2018, 09:26 | #4 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Я бы поспорил...я беру или С++/Ява, или луа/баш, или помеси. Остальные не воспринимаю. Еще, иногда перл, когда нужно с минимальной головной болью сдать заказ. Обычно билд скрипт на перле, который все качает и настраивает на голой машине, чтобы собрать остальное.
|
21.03.2018, 10:15 | #5 | |
Регистрация: 20.03.2018
Сообщений: 7
|
Цитата:
В общем, уже хорошо, что не как в Паскале. Там для классов необходимо всякий раз прописывать Foobar := TFoobar.Create, а в конце Foobar.Free и никак иначе. Что ж, тогда вполне себе жить можно, я почему-то ожидал от С++ плясок вокруг указателей. Итог. Оказалось, что таки да, NumBlasts выходит за границы. За советы спасибо, буду делать что-то посерьёзнее летающих кружочков - воспользуюсь. Отдельный лайк. Велосипеды надо делать тогда и только тогда, когда хочешь разобраться в устройстве велосипеда.
— Доктор, меня не понимают...
— вРН БШ ЯЙЮГЮКХ? |
|
21.03.2018, 10:44 | #6 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
Ну Java это аналог C#/.NET, его я посоветовал потому что он приятнее/современнее Джавы, и если только для винды, то особого смысла брать Джаву нет. (впрочем вместо самой Джавы для JVM еще есть стремительно набирающий популярность язык Kotlin, мне он тоже нравится) Сейчас для такого есть более удобные вещи типа Ansible или виртуальных машин через Vagrant или Docker.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
21.03.2018, 11:01 | #7 | ||
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Про виртуальные машины аналогично. На моих 8Гб рам просмотр этого форума и 1 вкладка с ютубом на паузе уже 5Гб прикушали. Поэтому даже приходится убивашки хромов и прочего прописывать в билд скрипты. Вопщем, спасибо - нет. Обойдемся без ВМ. Цитата:
Вобщем в С++ конструктор/деструктор вызывается автоматически обычно. НО! Есть возможность и ручного вызова (как в дельфи, даже сложнее в 2 операции - сначала память, а потом поверх нее конструктор), хотя это не для новичков. Последний раз редактировалось Alex11223; 21.03.2018 в 11:10. |
||
21.03.2018, 11:10 | #8 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Kotlin это не Go, а просто более приятная прагматичная замена Джаве, почти полностью совместимая с Java/JVM в обе стороны. Потому и набирает популярность (например в прошлом году стал вторым оф. языком для Андроида) в отличии от 100500 других языков JVM.
Ну вот Докер как раз по идее требует намного меньше памяти. Но сложнее разобраться с ним
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
21.03.2018, 12:29 | #9 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Вам бы комп проверить... У меня вкладок 30 точно открыто + 3 с ютубом и еще одна с трейлером на сайте игры и это все на на рабочей машинке с 4 Гб памяти.
|
21.03.2018, 17:02 | #10 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Хотя у меня еще блокировщики рекламы. Они тож память кушают, хотя по многим списком я вынес в pivoxy. Вот у него 100мб потребление, совершенно не ровня javascript аппам в хроме. Но в целом я согласен, индустрию пора чистить. Вот был qrcreator до в.4 на виджетах. 0.01с старт и готов к работе. Теперь мега-супер модное qml - 1с старт, 5-10 с открытие проекта...3Гб памяти уже нет. В попытках его ускорить они запилили кеширование...сломав всю идею обновления гуя без перекомпиляции...кошмар короче, как по мне творится с повсеместными интерпретаторами. Последний раз редактировалось alexzk; 21.03.2018 в 17:30. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как создавать именованные индексаторы для класса | OmegaBerkut | C# (си шарп) | 85 | 15.09.2016 22:15 |
как правильно создавать объекты в потоке? | Pcrepair | Общие вопросы Delphi | 2 | 02.04.2013 22:53 |
массив экземпляров класса | flibustier912 | Visual C++ | 1 | 05.05.2012 01:00 |
2-мерный динамический массив экземпляров класса. С++ | Парсифаль | Общие вопросы C/C++ | 1 | 29.12.2009 14:35 |
Как правильно программно создавать объекты на форме | Format C: | Общие вопросы Delphi | 16 | 05.07.2007 09:08 |