Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731

Расширение области видимости класса, за пределами цикла

06.10.2016, 22:22. Показов 4895. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, такой вопрос.... В общем пишу игру и а любая игра предполагает обновление экрана в цикле, дак вот..
Допустим я хочу создать класс который бы описывал бота. Это как-бы понятно и ничего сложного. Сложность, в том что если бот будет создан допустим на 20-м кадре то под конец рисования 20-го кадра будет вызван деструктор этого бота и в 21-м кадре придется все создавать заново.

Не могли бы вы мне объяснить как можно расширить область видимости, чтобы вызвать деструктор бота (класса) в том кадре (цикле) в котором это необходимо.
Чтобы не приходилось каждый кадр создавать заново класс и заполнять его старыми данными. Чтобы деструктор этого класса можно было вызвать тогда когда это угодно. И он не вызывался под конец цикла.

Я пока ничего из этого не писал, просто перед тем как начать писать я бы хотел понять как это может быть реализовано.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2016, 22:22
Ответы с готовыми решениями:

Элементы в области видимости и за ее пределами
Есть контрол Image. В случае если этот контрол в поле видимости пользователя, то нужно подгружать в него картинку, если контрол за видимыми...

Как использовать переменную за пределами области видимости?
у меня есть лист находящийся в using, можно ли как то ее увидить за пределами этой области в мейне?

Добавление класса блоку при его появление в области видимости окна браузера
Доброго времени суток При прокрутке страницы необходимо добавить блоку с class="block_scroll" класс anim Если блок на...

14
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
06.10.2016, 23:00
Создавай объекты динамически, т.е., к примеру, так:
C++
1
2
3
4
vector<Object> objects;
...
Object obj = new Object;
objects.push_back(obj);
В objects хранишь все существующие объекты (чтоб потом оттуда удалить), при необходимости создания нового объекта создаешь его динамически и добавляешь в общую коллекцию (к примеру, vector). Главное не забыть в конце программы удалить их (ну, или они удалятся, к примеру, после убийства).
1
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
07.10.2016, 02:14  [ТС]
То есть вы хотите сказать, то что будет создано через new не удалится пока не встретит delete?
И это не удалится даже если будет конец цикла? Хорошо это вроде бы понял, ладно... но ведь видимость созданного объекта все равно пропадает в конце цикла, разве нет? как же получить доступ к информации? Тут надо как-то использовать указатели?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
07.10.2016, 03:07
Лучший ответ Сообщение было отмечено koker007 как решение

Решение

Цитата Сообщение от koker007 Посмотреть сообщение
То есть вы хотите сказать, то что будет создано через new не удалится пока не встретит delete?
Да, или средствами ОС, когда программа завершится.
Цитата Сообщение от koker007 Посмотреть сообщение
но ведь видимость созданного объекта все равно пропадает в конце цикла, разве нет?
Правильнее сказать - время жизни такого объекта ограничено итерацией цикла (если создан в теле цикла, в автоматической памяти).
Цитата Сообщение от koker007 Посмотреть сообщение
Тут надо как-то использовать указатели?
Или указатели, или создавать в статической памяти. Пример monolit неверный, потому что new возвращает указатель, а не объект:
C++
1
Object* obj = new Object;
Время жизни такого указателя - итерация цикла, поэтому для дальнейшего доступа к объекту, через этот указатель, его нужно сохранить где-то за пределами цикла.

Добавлено через 8 минут
Цитата Сообщение от nd2 Посмотреть сообщение
или создавать в статической памяти.
Пример:
C++
1
2
3
4
5
6
7
    for (int i = 0; i < 6; ++i)
    {
        static int n = 10; // создаётся и инициализируется один раз, в статической памяти, 
                           // существует до окончания работы программы, виден только в теле цикла
        cout << n << ' '; // выведет: 10 11 12 13 14 15
        ++n;
    }
1
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
07.10.2016, 03:12  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
или копировать, например, в статическую память.
Под статической памятью подразумеваете использовать глобальные переменные?
Недавно узнал о операторе static, как вы считаете, насколько уместно его использование в данном случае? имею в виду... я знаю что у экземпляров классов объявленных с оператором static данные не стираются, они вроде бы тоже как глобальные, но стирается ли область видимости? как же все-таки получить доступ?
(не через указатели, с указателями теперь все понятно, спс)


Все, спасибо разобрался, не знал что вы сейчас редактируете. Спасибо )
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
07.10.2016, 04:02
Если цель - создание только одного объекта в цикле, с возможностью удаления в дальнейшем (в самом цикле, или после), то можно и без static обойтись. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
    int* p = nullptr;
    for (int i = 0; i < 6; ++i)
    {
        if (i == 0)
            p = new int(10); // объект создастся один раз в динамической памяти
                             // будет существовать до вызова delete
                             // доступ через указатель
       
        cout << *p << ' ';
        ++(*p);
    }
    cout << endl;
    cout << *p << endl;
    delete p;
Т.е., вариантов много.
1
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
07.10.2016, 15:08
Цитата Сообщение от nd2 Посмотреть сообщение
Пример monolit неверный, потому что new возвращает указатель, а не объект
Здрасте. А как это противоречит сохранению объекта за конкретной итерацией? А ему что, принципиальная разница создавать объект статически? Он вроде игру собрался писать, или что-то такое, и создавать объект динамически - самая здравая идея.

Само собой, этот указатель надо где-то хранить - я привел пример с vector'ом, т.е. массивом, который должен быть объявлен вне цикла (тут привели пример переменной - и это тоже извращение применительно к описанной задаче; если будет два "противника" - что, будете две переменные объявлять?).

А вот использовать для подобной задачи статическую память - это уже извращение. Нигде не видел подобного, и это очевидно. А ТС'у я бы посоветовал немного разобраться с матчастью. Направление с попыткой разобраться с языком на примере создания относительно большого проекта верное, но базовые вещи все-таки знать надо.

PS
В принципе, можно просто хранить объекты в векторе, не создавая их данамически (или в самописном динамическом массиве), но так мало кто делает, по моему опыту.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.10.2016, 02:52
Цитата Сообщение от monolit Посмотреть сообщение
Здрасте.
До свидания... Этот код не будет компилироваться:
Цитата Сообщение от monolit Посмотреть сообщение
C++
1
2
3
4
vector<Object> objects;
//...
Object obj = new Object;
objects.push_back(obj);
О чём и было написано:
Цитата Сообщение от nd2 Посмотреть сообщение
Пример monolit неверный, потому что new возвращает указатель, а не объект:
При чём здесь: противоречит или не противоречит, принципиальная разница или не принципиальная разница? Просто пиши грамотно. Или он у тебя компилируется?
1
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
08.10.2016, 07:48  [ТС]
Цитата Сообщение от monolit Посмотреть сообщение
я привел пример с vector'ом, т.е. массивом, который должен быть объявлен вне цикла
Я извиняюсь что снова тему поднимаю, просто хочу закрепить.
Я правильно понял что этот массив векторов хранит указатели на начало каждого элемента, то есть экземпляра класса?
И нужно ли как-то заранее объявлять максимальный размер у этого массива векторов? или же он как и char* сам подстроится в зависимости от количества отправляемых "символов" (в данном случае указателей на экземпляры)?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.10.2016, 08:17
Цитата Сообщение от koker007 Посмотреть сообщение
Я правильно понял что этот массив векторов
Нет там никакого массива векторов.
Цитата Сообщение от monolit Посмотреть сообщение
ТС'у я бы посоветовал немного разобраться с матчастью. Направление с попыткой разобраться с языком на примере создания относительно большого проекта верное, но базовые вещи все-таки знать надо.
http://www.cplusplus.com/reference/vector/vector/
1
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
08.10.2016, 15:52
Цитата Сообщение от nd2 Посмотреть сообщение
Этот код не будет компилироваться
Я утверждал обратное? Там и функции main() нет, если что, и заголовочные файлы не включены, да. да и класса Object нет как такового. Я привел пример действия в данной ситуации. Неужели это непонятно? Т.е. объявляем где-то (перед циклом, в глобальной области - неважно) массив std::vector<объект-врага-или-кого-то-там> objects и его используем для управления объектами (в самом просто случае).

Вот более подробно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <vector>
 
class Object {
   //...
};
 
int main() {
  std::vector<Object*> objects;
  while (true) {
    for (int i = 0; i<objects.size(); ++i) {
      // делаем что-то с каждым из имеющихся объектов objects[i]
    }
 
    // что-то делаем с массивом objects
 
    if (нужно добавить нового врага) {
      Object* obj = new Object();
      // ...
      objects.push_back(obj);
    }
 
    // ...
    // тут проверки на завершение цикла и все такое
  }
 
  return 0;
}
Не думал я, что до этого дойдет, ну да ладно.

Цитата Сообщение от koker007 Посмотреть сообщение
как и char* сам подстроится
char* никуда не подстраивается. Подстраивается std::string;

Ссылку на документацию по вектору тебе привели, почитай. Там все очень просто. И все-таки ты бы сперва что-то простое поделал, дабы разобраться с базовыми штуками из STL, языком и т.п. ИМХО.

PS
Да, я заметил, что указатель в объявлении массива пропустил. Ну а догадаться до того, что это опечатка, разве нельзя? Нельзя же быть таким "серьезным" и придираться к каждой мелочи в месте, где излагается лишь идея, и примеры приведены чисто для иллюстрации.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
08.10.2016, 16:48
Цитата Сообщение от monolit Посмотреть сообщение
Я утверждал обратное?
Ещё бы ты стал спорить с очевидным... А что тогда развозмущался на правильное замечание?
Цитата Сообщение от monolit Посмотреть сообщение
Да, я заметил, что указатель в объявлении массива пропустил.
Какого массива?
Цитата Сообщение от monolit Посмотреть сообщение
Ну а догадаться до того, что это опечатка, разве нельзя?
У тебя не слишком много опечаток? Две на три строчки.
Цитата Сообщение от monolit Посмотреть сообщение
примеры приведены чисто для иллюстрации.
Так трудно написать пример с корректным кодом из трёх строчек?
Цитата Сообщение от monolit Посмотреть сообщение
Не думал я, что до этого дойдет, ну да ладно.
Спасибо, снизошёл...
1
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
08.10.2016, 21:48
Цитата Сообщение от nd2 Посмотреть сообщение
А что тогда развозмущался на правильное замечание?
Я не возмущался, а просто заметил, что ты как-то слишком рьяно реагируешь на иллюстрационные примеры. Слишком.

Цитата Сообщение от nd2 Посмотреть сообщение
Так трудно написать пример с корректным кодом из трёх строчек?
[sarkasm] Ты раскрыл меня. На самом деле я в самом деле ничего не знаю, и писал наугад, да. Не попал...[/sarkasm]

Кликните здесь для просмотра всего текста
Не хочу больше с тобой спорить, тема не совсем для этого создана) Формально ты прав, но если бы ты отбросил свое высокое самомнение, то я бы не стал ничего возражать. А так это прозвучало слишком... обвиняюще.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.10.2016, 23:23
Цитата Сообщение от monolit Посмотреть сообщение
Я не возмущался, а просто заметил, что ты как-то слишком рьяно реагируешь на иллюстрационные примеры. Слишком.
примеры-иллюстрации,
которые содержат грубые ошибки,
и не компилируются - не нужны.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
09.10.2016, 05:03
Цитата Сообщение от monolit Посмотреть сообщение
но если бы ты отбросил свое высокое самомнение
Нет у меня никакого высокого самомнения, наоборот.
Цитата Сообщение от monolit Посмотреть сообщение
А так это прозвучало слишком... обвиняюще.
И что здесь такого уж "слишком обвиняющего"?
Цитата Сообщение от nd2 Посмотреть сообщение
Пример monolit неверный, потому что new возвращает указатель, а не объект:
Просто замечание по поводу, не более, и предназначалось оно ТС, а не тебе. Но если, для тебя, это прозвучало обвиняюще, то - извини.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2016, 05:03
Помогаю со студенческими работами здесь

Как скрыть из области видимости часть методов базового класса после наследования?
Продолжая тему наследования, в которой было выяснено, что можно вернуть в область видимости часть методов, которые потерялись при...

Программа за пределами видимости экрана
Ку алл. Как мне сделать чтоб программа появлялась за пределами видимости экрана и при наведении мышки к определенной области скраю экрана...

Вывод результата в теле цикла и за пределами цикла???
Вывод результата в теле цикла и за его пределами: 1. как это влияет на результат? 2. где про это можна почитать? Спасибо:)

Динамически создаваемые кнопки за пределами видимости формы имеют некорректные координаты
data.button-&gt;Text=&quot;бот&quot; + data.id; data.button-&gt;Text+=&quot; &quot; + and_CharToSysString(data.ip_string); ...

Видимость переменных за пределами цикла
Помогите, пожалуйста, разобраться с видимостью переменных. Допустим есть код , код который считает количество четных чисел в диапазоне: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru