Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114

SFML. Вектора, массивы, классы, объекты

01.11.2017, 21:59. Показов 6888. Ответов 67

Студворк — интернет-сервис помощи студентам
Доброго времени суток форумчане!
Возникла проблема с векторами. но понимаю как работают эти самые векторы.
Задача такова, есть абстрактный класс Object с какими-то функциями(это не столь важно). Так же есть дочерние классы такие как Circle и Circle2. В главной функции создаются новые объекты дочерних классов и заносятся в массив.
НО когда хочу сделать через вектор то выдаёт ошибку: "error: 'vector' does not name a type".
так же по мере решения это проблемы будет ещё несколько вопросов таких как: "Как реализовать уничтожение объектов Массива/Вектора", "Как сделать универсальную функцию определения координат курсора в окне"
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.11.2017, 21:59
Ответы с готовыми решениями:

Не отрисовываются объекты openGL3.0 в SFML
Почему-то не отрисовываются объекты "нового" опенгл. Старый работает нормально. Перепробовал уже кучу примеров, толку никакого. ...

Из первых четырех строк массива сформировать четыре новых вектора (одномерные массивы). Для каждого вектора найти сумму
Дан двухмерный массив размером M x N. Преобразовать его по правилу – все элементы каждого столбца матрицы умножить на минимальный...

Классы и объекты
Добрый день всем.Хотел узнать кое что,надеюсь вопрос будет соответствовать название темы:) На лабораторной поставили задачу,создать...

67
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
01.11.2017, 23:44  [ТС]
Студворк — интернет-сервис помощи студентам
Вот вам на рассмотрения файл Main.cpp
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "Include.h"
#include "Function.cpp"
#include "Object.cpp"
#include "Circle1.cpp"
#include "Circle2.cpp"
#include <vector>
 
 
using namespace sf;
 
Object* obj[1]; // массив на объекты Circle и Circle2 и других объектов классов дочерних классу Object
 
//std::vector<int> k(1);
// Функция обновления всех созданных объектов
void Update(int id){
    for (int i=0; i<id; i++)
        obj[i]->Update();
}
 
int main(){
 
    bool upd=false, preSpase=false, preControl=false; // preSpase и preControl показывающие каким было состояние клавиш на предыдущей интеракции
    int id=0; // номер нового объекта
    RenderWindow window(VideoMode(600, 500), "WinGraph");
    Event event;
    window.setFramerateLimit(60);
 
// Элементы окружности для курсора для удобного позиционирования объектов в окне
    CircleShape SCircle(50), S2Circle(25);
    SCircle.setOrigin(50,50);
    S2Circle.setOrigin(25,25);
    SCircle.setFillColor(Color(0,0,0,0));
    S2Circle.setFillColor(Color(0,0,0,0));
    SCircle.setOutlineThickness(1);
    S2Circle.setOutlineThickness(1);
    SCircle.setOutlineColor(Color(125,150,50));
    S2Circle.setOutlineColor(Color(50,125,150));
 
 
    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
 
// Создание нового объекта
        if (!preSpase)
        if (Keyboard::isKeyPressed(Keyboard::Space)){
            Circle *cir = new Circle();
            cir->XX = mouse_xy(0, &window);
            cir->YY = mouse_xy(1, &window);
            cir->window = &window;
            cir->ID=id;
            cir->Create();
            obj[id] = cir;
            id++;
            upd=true;
        }
        if (!preControl)
        if (Keyboard::isKeyPressed(Keyboard::LControl)){
            Circle2 *cir = new Circle2();
            cir->XX = mouse_xy(0, &window);
            cir->YY = mouse_xy(1, &window);
            cir->window = &window;
            cir->ID=id;
            cir->Create();
            obj[id] = cir;
            id++;
            upd=true;
        }
 
        SCircle.setPosition(mouse_xy(0,&window),mouse_xy(1,&window));
        S2Circle.setPosition(mouse_xy(0,&window),mouse_xy(1,&window));
 
        preSpase = Keyboard::isKeyPressed(Keyboard::Space);
        preControl = Keyboard::isKeyPressed(Keyboard::LControl);
 
        window.clear(Color(240,240,240));
 
        if (upd)
            Update(id);
        window.draw(SCircle);
        window.draw(S2Circle);
 
        window.display();
    }
}
Добавлено через 1 минуту
так как Update постоянно проходит по всему массиву, то при проходе ячейки где БЫЛ когда-то объект выдаёт ошибку
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
01.11.2017, 23:44
Зачем массив с одним элементом?
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
01.11.2017, 23:45  [ТС]
ну не знаю, но то что там всего один объект не мешает добавлять свыше него новые элементы, не совсем понял почему так происходит...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
01.11.2017, 23:46
Если у тебя вектор, то ты удаляешь сам объект, а затем элемент из вектора. Размер уменьшается и цикл туда не попадёт.
Но ради одного элемента нет смысла использовать массивы.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
01.11.2017, 23:49  [ТС]
собственно вот и все объекты которые есть на экране (заполненные круги) их как видно более 1-го но это не мешает массиву
Миниатюры
SFML. Вектора, массивы, классы, объекты  
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
01.11.2017, 23:51  [ТС]
не знаю почему но массив как-то сам расширяется когда создаю новый объект (Лазурный и Зелёный круг)
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
01.11.2017, 23:53  [ТС]
вот, ещё как демонстрация
Миниатюры
SFML. Вектора, массивы, классы, объекты  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
01.11.2017, 23:54
Ты выходишь за пределы массива.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
01.11.2017, 23:55  [ТС]
и все объекты обновляются нормально, то есть движутся по экрану как и прописано в их классах

Добавлено через 27 секунд
Ну это понятно, но разве не должно быть ошибки?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
01.11.2017, 23:57
Гарантированно и с первого раза - нет. Но программа неправильная.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 00:03  [ТС]
Согласен что это косяк, но просто были проблемы с векторами

Добавлено через 1 минуту
Как теперь добавлять в вектор новый объект Circle/Circle2 и прочие дочерние объекты?

Добавлено через 3 минуты
и как более корректно сделать удаление объекта?
У меня была идея такая:
в то время как функция Update проходит по вектору, то она бы отправляла объекту номер ячейки этого объекта в векторе, так сказать свой ID. В свою очередь объект который был потревожен функцией проверял бы условие уничтожения, удалял своё место в векторе, а затем и сам себя.
Ну или есть более простой и корректный способ?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 09:36
Цитата Сообщение от SkeiTax Посмотреть сообщение
Как теперь добавлять в вектор новый объект
push_back()
Что за удаление самого себя? Идёшь по вектору в цикле - сразу и удаляй.
C++
1
2
delete obj[i];
obj.erase(obj.begin() + i);
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 12:49  [ТС]
Условие на удаление находится внутри объекта и если это условие выполняется то объект должен удалиться.
В проекте есть объекты Круг и круг2 если внутри радиуса этого объекта есть курсор то объект удаляется иначе ничего не делается. И это условие находится внутри объекта круг и круг2
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 13:24
У тебя какая-то запутанная реализация. Как он удаляет сам себя? Кто delete делает?
Сделай, например, чтобы условие можно было проверить извне, функцию какую-то, и дальше по результату.
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
02.11.2017, 14:43
SkeiTax, короче, так никто не пишет. Никакие объекты сами себя удалять не должны, потому что объекты никак не могут знать, кто ими пользуется, каким образом они созданы (через new, malloc, или автоматически как переменная в программе), сколько указателей на них в каких местах программы сохранено и используются и.т.д.
Возможно, исключением из этой ситуации являются самописные смартпойнтеры, но не о них речь.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 17:39  [ТС]
Эх... Собственно к чему все это я узнаю, я узнаю это для того, что бы потом мне было проще реализовывать те или иные объекты. Я хочу сделать подобие игры какой-нибудь. Представим есть объект который может стрелять, то есть этот объект должен создавать другие объекты, объекты пуль который в свою очередь должны уничтожаться при выполнении того или иного условия. Например пуля столкнулась с объектом препятствием а значит она должна удалиться.

Добавлено через 5 минут
Вообще всё это делаю не из головы, есть программа GM(Game Maker), так там есть простая функция для удаления объекта(экземпляра): instance_destroy()
допустим ты создаёшь в этой программе объект пуля, в игре срабатывает условие в этом объекте которое запускает ту функцию и в результате объект удаляется.
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
02.11.2017, 19:00
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class circle{
Sf::vector2f position;
float radius;
bool collide(circle& other)
};
Class circleManager{
STD::vector<circle> objects;
Public:
Void update(){
For(i = objects.begin(); i!=objects.end(); )
if (i->collide(xxx) )
 i = objects.erase(i);
else 
  ++i;
  }
}
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 19:03  [ТС]
Можете пояснить?
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
02.11.2017, 19:15
А чего пояснять? Класс это сущность которая должна управлять только своим состоянием. Любой класс, в том числе круг знает лишь своё состояние, но не состояние своих хозяев, контейнеров, векторов.. Если другой большой какой-то класс или функция или даже функция мейн просто хранит вектор объектов этого круга, то она и должна добавлять|удалять элементы в этот вектор. Сам круг никак не должен знать, кто его хранит, это в не его уровня абстракции. Но зато он может проверять условие своего удаления!
Но опять таки проверять это условие лишь тогда и только тогда, когда его об этом хозяин спрашивает.
1. Хозяин попросил условие у круга
2. Круг ответил таки да
3. Хозяин попросил у вектора убить круг
4. Круг сдох, даже не зная, что всю жизнь прожил в векторе
0
02.11.2017, 19:23

Не по теме:

Вот и я о том же.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2017, 19:23

объекты и классы
Здравствуйте. Помогите с задачей. Нужно написать программу на классы и объекты. Пользователь вводит символьную строку, а программа...

Классы, объекты
Привет. Необходимо обратиться к объекту не используя (например, TextBox a = (TextBox)sender) т.к. необходимо использовать ещё и ComboBox с...

Классы и объекты
Создать объявление класса и разработать программу-драйвер, который продемонстрирует работу класса. Клас Cylinder (циліндр). Клас має...

КЛАССЫ И ОБЪЕКТЫ
Помогите с кодом: Рациональная (несократимая) дробь представляется парой целых чисел (а, b), где а — числитель, b — знаменатель....

Классы и объекты
Здравствуйте объясните пожалуйста следующую задачу Нужно создать класс данных А и класс отображения данных В при этом объекст...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru