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

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

01.11.2017, 21:59. Показов 6308. Ответов 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
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 20:46
Студворк — интернет-сервис помощи студентам
Какую ошибку? Деструктор есть? Там вообще что-то надо внутри освобождать?
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:03  [ТС]
я понял свою ошибку

Добавлено через 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
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 21:12
Вроде уже разобрались, что объект не может сам себя удалять. Цикл этот должен быть в main() или ещё где-то, но не в классе Circle.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:18  [ТС]
В таком виде объекты создаются:
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
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 21:21
Update() кому принадлежит?
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:25  [ТС]
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
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.11.2017, 21:47
C++
1
2
3
4
    bool ODelete()
    {
        return death;
    }
Внутри класса просто использовать death.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 114
02.11.2017, 21:54  [ТС]
хмм... Нууу в принципе да, согласен. Я написал лишнего...

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


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

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
68
Ответ Создать тему
Новые блоги и статьи
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