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

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

01.11.2017, 21:59. Показов 6345. Ответов 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 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 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 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 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 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru