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

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

06.10.2016, 22:22. Показов 4854. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru