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

Проблема с абстракным классом

04.05.2020, 10:09. Показов 984. Ответов 5
Метки с++ (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте, задача программы - создать составной графический элемент, который движется по кругу и вращается.

Проблема заключается в том, что я создал основной объект (вокруг которого остальные объекты будут крутиться) через указатель на абстрактный класс, и теперь при вызове методов, массив с координатами пустой. Все методы работают исправно.


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
90
91
92
93
#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#include <GL/glew.h>
#include "classes.h"
 
#define Window_Height 800
#define Window_Width 800
 
int main()
{
    int triangValue, ractValue,choosenumb=0;
    GLfloat Center[] {Window_Width/2,Window_Height/2},
            *dv;
    double angl = 0.001, 
           rot_alpha = 0.001;
    shape *MainPart;
    vector<triangle*> triangles;
    vector<ract*> ractangles;
    while (1) {
        cout << "Choose the main part:\n1)Triangle\n2)Ractengle\n->";
        cin >> choosenumb;
        if (choosenumb == 1) {
            MainPart = new triangle();
            break;
        }
        else if (choosenumb == 2) {
            MainPart = new ract();
            break;
        }
        else
            cout << "Wrong option has been choosen! Try again." << endl;
    }
    cout << "Enter the number of triangles: ";
    cin >> triangValue;
    for (int i = 0; i < triangValue; i++) {
        cout << i + 1 << " Triangle:" << endl;
        triangle *t = new triangle();
        triangles.push_back(t);
    }
    cout << "Enter the number of ractangles: ";
    cin >> ractValue;
    for (int i = 0; i < ractValue; i++) {
        cout << i + 1 << " Ractangle:" << endl;
        ract *r = new ract();
        ractangles.push_back(r);
    }
    sf::ContextSettings settings;
    settings.majorVersion = 3;
    settings.minorVersion = 3;
    settings.depthBits = 24;
    sf::RenderWindow window(sf::VideoMode(Window_Width, Window_Height), "OPenGL+SFML window", sf::Style::Default, settings);
    window.setActive(true);
    glewExperimental = true;
    GLenum result = glewInit();
    if (result != GLEW_OK) {
        std::cout << "Error!!!: " << glewGetErrorString(result) << std::endl;
    }
    glLoadIdentity();
    glOrtho(0.0f, Window_Width, 0.0f, Window_Height, 0.0f, 1.0f);
    while (window.isOpen()) {
        glClearColor(0.2, 0.2, 0.2, 1.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLineWidth(3.0);
        
        MainPart->draw();
        dv = MainPart->PrimerMove(Center, angl);
        for (int i = 0; i < triangValue; i++) {
            triangles[i]->draw();
        }
        for (int i = 0; i < ractValue; i++) {
            ractangles[i]->draw();
        }
        for (int i = 0; i < triangValue; i++) {
            triangles[i]->AdditionalMove(dv);
            triangles[i]->Rotate(MainPart->getCenter(), rot_alpha);
        }
        for (int i = 0; i < ractValue; i++) {
            ractangles[i]->AdditionalMove(dv);
            ractangles[i]->Rotate(MainPart->getCenter(), rot_alpha);
        }   
        angl += 0.0005;
        sf::Event ev;
        while (window.pollEvent(ev)) {
            if (ev.type == sf::Event::Closed) {
                window.close();
            }
            
        }
        window.display();
    }
    return 0;
}
classes.h
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
#pragma once
#include <GL/glew.h>
 
using namespace std;
 
class shape {
private:
    GLfloat *CordArray;
public:
    virtual GLfloat* getCenter() = 0;  //Возвращает геометрический центр фигуры
    virtual void draw() = 0; //отрисовка объекта
    virtual GLfloat* PrimerMove(GLfloat*,float) = 0;   //Движение основного объекта, возвращает на какое количество
                                                          //координат нужно сместиться остальным объектам
    virtual void AdditionalMove(GLfloat*) = 0;           //Движение доп. объектов
    virtual void Rotate(GLfloat*,float) = 0;
};
 
class triangle : public shape {
private:
    GLfloat *CordArray;
public:
    triangle();
    triangle(GLfloat *arr);
    GLfloat* getCenter();
    void draw();
    GLfloat* PrimerMove(GLfloat *BaseCords, float alpha);
    void AdditionalMove(GLfloat*);
    void Rotate(GLfloat* RotCenter, float alpha);
    ~triangle();
};
 
class ract : public shape {
private:
    GLfloat *CordArray;
public:
    ract();
    ract(GLfloat *arr);
    GLfloat* getCenter();
    void draw();
    GLfloat* PrimerMove(GLfloat *BaseCords,float alpha);
    void AdditionalMove(GLfloat*);
    void Rotate(GLfloat* RotCenter, float alpha);
    ~ract();
};
classes.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "classes.h"
#include <GL/glew.h>
#include <iostream>
 
using namespace std;
 
triangle::triangle(GLfloat *arr) : CordArray{ arr } {
    cout << "Constructing triangle class" << endl;
}
 
triangle::triangle() {
    float temparr[6];
    for (int i = 0; i < 3; i++) {
        cout << "Type a X and Y cords for " << i + 1 << " corner of triangle: ";
        cin >> temparr[2 * i] >> temparr[2 * i + 1];
    }
    this->CordArray = temparr;
    cout << "Constructing triangle class" << endl;
}
 
GLfloat* triangle::getCenter() {
    GLfloat *CenterCords= new GLfloat[2];
    CenterCords[0] = (CordArray[0] + CordArray[2] + this->CordArray[4]) / 3;
    CenterCords[1] = (CordArray[1] + CordArray[3] + this->CordArray[5]) / 3;
    return CenterCords;
}
 
void triangle::draw() {
    glVertexPointer(2, GL_FLOAT, 0, this->CordArray);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_LINE_LOOP, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
}
 
GLfloat* triangle::PrimerMove(GLfloat *BaseCords,float alpha) {
    GLfloat *Center, *dv=new GLfloat[2];
    Center = this->getCenter();
    dv[0] = BaseCords[0] + sqrt(pow(Center[0] - BaseCords[0], 2) + pow(Center[1] - BaseCords[1], 2))*cos(alpha) - Center[0];
    dv[1] = BaseCords[1] + sqrt(pow(Center[0] - BaseCords[0], 2) + pow(Center[1] - BaseCords[1], 2))*sin(alpha) - Center[1];
    for (int i = 0; i < 6; i+=2) {
        this->CordArray[i] += dv[0];
        this->CordArray[i + 1] += dv[1];
    }
    return dv;
}
 
void triangle::AdditionalMove(GLfloat* dv) {
    for (int i = 0; i < 6; i += 2) {
        this->CordArray[i] += dv[0];
        this->CordArray[i + 1] += dv[1];
    }
}
 
void triangle::Rotate(GLfloat* RotCenter, float alpha) {
    GLfloat x, y;
    for (int i = 0; i < 6; i += 2) {
        x = RotCenter[0] + (this->CordArray[i] - RotCenter[0]) * cos(alpha) - (this->CordArray[i + 1] - RotCenter[1]) * sin(alpha);
        y = RotCenter[1] + (this->CordArray[i] - RotCenter[0]) * sin(alpha) + (this->CordArray[i + 1] - RotCenter[1]) * cos(alpha);
        this->CordArray[i] = x;
        this->CordArray[i + 1] = y;
    }
}
 
triangle::~triangle() {
    cout << "Decostructing triangle class" << endl;
}
 
ract::ract(GLfloat *arr) : CordArray{ arr } {
    std::cout << "Constructing ractangle class" << std::endl;
}
 
ract::ract() {
    float temparr[8];
    for (int i = 0; i < 4; i++) {
        cout << "Type a X and Y cords for " << i + 1 << " corner of ractangle: ";
        cin >> temparr[2 * i] >> temparr[2 * i + 1];
    }
    this->CordArray = temparr;
    cout << "Constructing ractangle class" << endl;
}
 
GLfloat* ract::getCenter() {
    GLfloat *CenterCords = new GLfloat[2];
    CenterCords[0] = abs(this->CordArray[0]+this->CordArray[4])/2;
    CenterCords[1] = abs(this->CordArray[1] + this->CordArray[5]) / 2;
    return CenterCords;
}
 
void ract::draw() {
    glVertexPointer(2, GL_FLOAT, 0, this->CordArray);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_LINE_LOOP, 0, 4);
    glDisableClientState(GL_VERTEX_ARRAY);
}
 
GLfloat* ract::PrimerMove(GLfloat *BaseCords, float alpha) {
    GLfloat *Center, *dv = new GLfloat[2];
    Center = this->getCenter();
    dv[0] = BaseCords[0] + sqrt(pow(Center[0] - BaseCords[0], 2) + pow(Center[1] - BaseCords[1], 2))*cos(alpha) - Center[0];
    dv[1] = BaseCords[1] + sqrt(pow(Center[0] - BaseCords[0], 2) + pow(Center[1] - BaseCords[1], 2))*sin(alpha) - Center[1];
    for (int i = 0; i < 8; i += 2) {
        this->CordArray[i] += dv[0];
        this->CordArray[i + 1] += dv[1];
    }
    return dv;
}
 
void ract::AdditionalMove(GLfloat* dv) {
    for (int i = 0; i < 6; i += 2) {
        this->CordArray[i] += dv[0];
        this->CordArray[i + 1] += dv[1];
    }
}
 
void ract::Rotate(GLfloat* RotCenter, float alpha) {
    GLfloat x, y;
    for (int i = 0; i < 8; i += 2) {
        x = RotCenter[0] + (this->CordArray[i] - RotCenter[0]) * cos(alpha) - (this->CordArray[i + 1] - RotCenter[1]) * sin(alpha);
        y = RotCenter[1] + (this->CordArray[i] - RotCenter[0]) * sin(alpha) + (this->CordArray[i + 1] - RotCenter[1]) * cos(alpha);
        this->CordArray[i] = x;
        this->CordArray[i + 1] = y;
    }
}
 
ract::~ract() {
    cout << "Decostructing ract class" << endl;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2020, 10:09
Ответы с готовыми решениями:

Проблема с классом Дата
Задание: На аптечном складе хранятся лекарства.Сведения о лекарствах содержатся в специальной ведомости : наименование лекарственного...

Проблема с классом string
Здравствуйте, уважаемые пользователи! Я пытаюсь создать программу с классом string, но при компиляции появляется ошибка, что string не...

Проблема с классом Вектор
Здравствуйте! Не могу понять почему вместо значений вектора выводиться непонятные числа. Вот код: #include &lt;vector&gt; ...

5
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.05.2020, 10:39 2
Цитата Сообщение от Llirkit Посмотреть сообщение
Проблема заключается в том, что я создал основной объект (вокруг которого остальные объекты будут крутиться) через указатель на абстрактный класс, и теперь при вызове методов, массив с координатами пустой. Все методы работают исправно.
В смысле, пустой?
Что возвращает getCenter?
0
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 3
04.05.2020, 10:49  [ТС] 3
выводит мусор:
Миниатюры
Проблема с абстракным классом  
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.05.2020, 10:55 4
Лучший ответ Сообщение было отмечено Llirkit как решение

Решение

Цитата Сообщение от Llirkit Посмотреть сообщение
выводит мусор:
Цитата Сообщение от Llirkit Посмотреть сообщение
triangle::triangle() {
    float temparr[6];
    for (int i = 0; i < 3; i++) {
        cout << "Type a X and Y cords for " << i + 1 << " corner of triangle: ";
        cin >> temparr[2 * i] >> temparr[2 * i + 1];
    }
    this->CordArray = temparr;
Цитата Сообщение от Llirkit Посмотреть сообщение
ract::ract() {
    float temparr[8];
    for (int i = 0; i < 4; i++) {
float *temparr = new float[6];
1
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 3
04.05.2020, 10:58  [ТС] 5
Спасибо, работает!
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
04.05.2020, 11:00 6
Цитата Сообщение от Llirkit Посмотреть сообщение
Спасибо, работает!
Не забудь удалить CordArray
Цитата Сообщение от Llirkit Посмотреть сообщение
ract::~ract() {
    cout << "Decostructing ract class" << endl;
}
Цитата Сообщение от Llirkit Посмотреть сообщение
triangle::~triangle() {
    cout << "Decostructing triangle class" << endl;
}
delete[] CordArray;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2020, 11:00
Помогаю со студенческими работами здесь

Проблема с классом и массивом char-ов
Есть класс, содержащий одномерный массив из char-ов и методы для работы с ним. Проблема возникла в самом начале - не получается корректно...

Проблема с классом для линейного списка
Доброго времени суток! Начал писать класс для организации хранения данных в виде линейного списка, вот Header file:...

Проблема с классом компилятор выдает ошибку was not declared in this scope
Взяла простой пример , чтобы разобрать как обращаться с сpp-файла к классу.Как я поняла мне компилер говорит, что я не могу обратится к...

Проблема с классом
Доброе времени суток...у меня проблема в создании класса - динамического массива! проблема в изминении определённого элемента и вывода на...

Проблема с классом
Здравствуйте, уважаемые форумчане! Дело в том, что про запуске проги и работе с классами, я не могу получить из ни инфу, хоть и снял...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Что нового в C# 14
UnmanagedCoder 10.03.2025
Предстоящая версия C# 14 обещает принести изменения, которые сделают разработку еще более приятной и эффективной. Что стоит отметить, так это влияние сообщества разработчиков на формирование новых. . .
Формулы поворота
Igor3D 10.03.2025
Добрый день Тема Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости". x' = x * cos(a) - y * sin(a) y' = y * cos(a) + x * sin(a) Как бы Вы их. . .
Что нового в .NET 10
UnmanagedCoder 10.03.2025
. NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация. . .
Отложенное высвобождение, RCU и Hazard Pointer в C++26
NullReferenced 09.03.2025
Многопоточное программирование стало важной частью современной разработки. Когда несколько потоков одновременно работают с общими данными, возникает целый ряд проблем, связанных с синхронизацией и. . .
Неблокирующийся стек на C++26
NullReferenced 09.03.2025
Традиционные способы синхронизации в многопоточном программировании — мьютексы, семафоры, условные переменные — часто превращаются в узкое место в плане производительности. При этом неблокирующиеся. . .
Обработка строк в C++26: Новые возможности string и string_view
NullReferenced 09.03.2025
Новый стандарт C++26 предлагает много улучшений для работы с привычными string и относительно новыми string_view. string_view - это невладеющая ссылка на последовательность символов, появившаяся в. . .
Мой первый аддон для Blender 3D, с помощью нейронки (не зная даже азов пайтона, но это не значит что так и с остальным).
Hrethgir 09.03.2025
Потратил весь день. Пол-дня мне хватило, чтобы понять что с версией с 14B мне не одолеть написание функционального кода, на языке с которым я вообще никак не знаком - пайтон. Версия 22B от другого. . .
Einstein@Home сегодня исполняется двадцать лет!
Programma_Boinc 09.03.2025
Einstein@Home сегодня исполняется двадцать лет! Отправлено 19 февраля 2025 года в 17:20:21 UTC Я хочу поздравить всех наших волонтеров, разработчиков и ученых из Einstein@Home. Мы официально. . .
Заполнители и расширенный набор символов в C++26
NullReferenced 09.03.2025
C++26 представляет два важных обновления: заполнители и расширенный набор символов. Заполнители (placeholders) решают давнюю проблему лаконичности кода в шаблонных выражениях и лямбда-функциях. Они. . .
Контракты в C++26
NullReferenced 09.03.2025
Контракты – это механизм, позволяющий указывать предусловия, постусловия и инварианты для функций в коде. Эта функциональность должна была стать частью C++20, но была исключена на встрече комитета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru