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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток форумчане!
Возникла проблема с векторами. но понимаю как работают эти самые векторы.
Задача такова, есть абстрактный класс 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
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 20:46 61
Author24 — интернет-сервис помощи студентам
Какую ошибку? Деструктор есть? Там вообще что-то надо внутри освобождать?
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:03  [ТС] 62
я понял свою ошибку

Добавлено через 31 секунду
или нет...

Добавлено через 47 секунд
вот код Update()
C++
1
2
3
4
5
6
7
8
9
10
11
void Update(){
    for (std::vector<Object*>::iterator i = obj.begin(); i != obj.end(); ){
        if ((*i)->ODelete() == true){
            delete *i;
            i = obj.erase(i);
        }else{
            (*i)->Update();
            ++i;
        }
    }
}
Добавлено через 34 секунды
вот код создания объекта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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->Create();
            obj.push_back(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->Create();
            obj.push_back(cir);
            id++;
            upd=true;
        }
Добавлено через 10 минут
В таком виде не работает:
C++
1
2
3
4
5
6
7
        if ((*i)->ODelete()){
            delete *i;
            i = obj.erase(i);
        }else{
            (*i)->Update();
            ++i;
        }
В таком работает:
C++
1
2
            (*i)->Update();
            ++i;
Ну то есть создаётся объект

Добавлено через 3 минуты
И снова косяки...
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 21:12 63
Вроде уже разобрались, что объект не может сам себя удалять. Цикл этот должен быть в main() или ещё где-то, но не в классе Circle.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:18  [ТС] 64
В таком виде объекты создаются:
C++
1
2
3
4
5
6
7
8
9
    for (std::vector<Object*>::iterator i = obj.begin(); i != obj.end();){
        //if (!(*i)->ODelete()){
            (*i)->Update();
            ++i;
        //}else{
            //delete *i;
            //obj.erase(i);
        //}
    }
А вот без комментарий нет...

Добавлено через 1 минуту
этот цикл в Функции Update(), которая в свою очередь обновляет все объекты

Добавлено через 1 минуту
в классе Circle/Circle2 прописан метод ODelete() который возвращает true если нужно удалить объект и false в обратном случае
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 21:21 65
Update() кому принадлежит?
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:25  [ТС] 66
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
using namespace sf;
 
std::vector<Object*> obj;
 
void Update(){
    for (std::vector<Object*>::iterator i = obj.begin(); i != obj.end();){
        if ((*i)->ODelete()){
            delete *i;
            obj.erase(i);
        }else{
            (*i)->Update();
            ++i;
        }
    }
}
 
int main(){
    bool upd=false, preSpase=false, preControl=false;
    //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->Create();
            obj.push_back(cir);
            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->Create();
            obj.push_back(cir);
            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();
        window.draw(SCircle);
        window.draw(S2Circle);
 
        window.display();
    }
}
Circle.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
class Circle : public Object{
public:
    float x, XX, y, YY, speed, R=50;
    int dir;
    bool death;
    Object* ID;
 
    RenderWindow *window;
    CircleShape shape;
 
    void Create(){
        death=false;
        x=XX;
        y=YY;
        dir=0;
        speed=0;
 
        shape.setRadius(R);
        shape.setOrigin(R,R);
        shape.setFillColor(Color(150,175,75));
    }
 
    bool ODelete(){
        death=true;
        return death;
    }
 
    void Update(){
        Step();
        Draw();
    }
 
private:
    void Step(){
        speed-=0.1;
 
        if (Keyboard::isKeyPressed(Keyboard::A)||
            Keyboard::isKeyPressed(Keyboard::D)||
            Keyboard::isKeyPressed(Keyboard::W)||
            Keyboard::isKeyPressed(Keyboard::S))
            if(speed<2) speed=2;
 
        if (Keyboard::isKeyPressed(Keyboard::LShift)&&
            (Keyboard::isKeyPressed(Keyboard::A)||
             Keyboard::isKeyPressed(Keyboard::D)||
             Keyboard::isKeyPressed(Keyboard::W)||
             Keyboard::isKeyPressed(Keyboard::S)))
            speed = 5;
 
        if (speed<0) speed=0;
        if (Keyboard::isKeyPressed(Keyboard::A)) dir=180;
        if (Keyboard::isKeyPressed(Keyboard::D)) dir=0;
        if (Keyboard::isKeyPressed(Keyboard::W)) dir=90;
        if (Keyboard::isKeyPressed(Keyboard::S)) dir=270;
        y-=sin(dir*M_PI/180)*speed;
        x+=cos(dir*M_PI/180)*speed;
 
        if (distance_to_point(x, y, mouse_xy(0, window), mouse_xy(1, window))<R){
            shape.setFillColor(Color(120,130,50));
            if (Mouse::isButtonPressed(Mouse::Left))
                ODelete();
        }else
            shape.setFillColor(Color(150,175,75));
 
    }
 
    void Draw(){
        shape.setPosition(x, y);
        window->draw(shape);
    }
 
    ~Circle(){}
};
0
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 21:47 67
C++
1
2
3
4
    bool ODelete()
    {
        return death;
    }
Внутри класса просто использовать death.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:54  [ТС] 68
хмм... Нууу в принципе да, согласен. Я написал лишнего...

Добавлено через 13 секунд


Добавлено через 2 минуты
Ну господа, первый этап сделан
1. Добавление объектов;
2. Обновление объектов и их отрисовка;
3. Удаление объектов.

Добавлено через 1 минуту
теперь осталось навести красоту в коде, переделать Create() в конструктор и т.п.

Добавлено через 55 секунд
В общем большое спасибо, но я уверен что скоро вернусь!
0
02.11.2017, 21:54
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2017, 21:54
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
68
Ответ Создать тему
Новые блоги и статьи
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
Как создавать приложения для iOS/iPhone
InfoMaster 12.01.2025
Введение в разработку iOS-приложений Разработка приложений для iOS открывает огромные возможности в мире мобильных технологий. С каждым годом количество пользователей iPhone и iPad растет,. . .
Как использовать Kotlin в Android разработке
InfoMaster 12.01.2025
Язык программирования Kotlin, разработанный компанией JetBrains, стал неотъемлемой частью современного мира Android-разработки. Первоначально представленный в 2011 году, Kotlin был официально. . .
Использование Go (Golang) в backend разработке
InfoMaster 12.01.2025
Язык программирования Go (Golang), разработанный компанией Google, стал важным инструментом для разработчиков программного обеспечения, особенно в области бэкенд-разработки. С момента своего. . .
Как работать с Laravel в PHP
InfoMaster 12.01.2025
Введение в Laravel Laravel представляет собой современный PHP-фреймворк с открытым исходным кодом, который значительно упрощает и ускоряет процесс разработки веб-приложений. Этот фреймворк был. . .
Как программировать под HCL Notes и создавать свои продукты на ее основе
InfoMaster 11.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой мощную платформу для разработки корпоративных приложений, которая сочетает в себе функции электронной почты, календаря,. . .
Как работать с SVN (Subversion)
InfoMaster 11.01.2025
Введение Система контроля версий является неотъемлемой частью современного процесса разработки программного обеспечения. Она обеспечивает управление изменениями в коде, позволяет отслеживать. . .
Использование GraphQL в JavaScript
InfoMaster 11.01.2025
Введение в GraphQL и его преимущества В современной разработке веб-приложений эффективный обмен данными между клиентом и сервером играет ключевую роль. GraphQL представляет собой язык запросов и. . .
Администрирован­­­­ие Git, продвинутые техники работы с Git
InfoMaster 11.01.2025
Основы управления репозиторием Эффективное управление Git-репозиторием требует глубокого понимания механизмов контроля доступа и инструментов администрирования. Рассмотрим ключевые аспекты. . .
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru