Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 265
1

Динамический массив как поле класса

06.10.2022, 22:13. Показов 1670. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть класс Комплексных чисел, в котором реализована возможность для +, -, *. /, получения сопряженного и обратного. Также этот класс - наследник класса Object. Этот класс имеет функционал для отслеживания сколько было созданного объектов и сколько активны. Теперь мне нужно реализовать функционал для создания динамического массива - списка всех выполненных операций с объектом. При выполнении каждой операции её обозначение заносится в данный массив через метод addOp. Метод
clearOp – очищает массив операций. Метод printOp – выводит полный список всех выполненных операций с объектом.

Моя попытка написания - какой то бред. Хотя, возможно, худо-бедно добавить именно поле-динам.массив получилось. Но вот как работать с ним вобще не понимаю

C++ (Qt)
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <math.h> 
using namespace std;
 
 
class Object
{
    static int nextId; // следующий присваиваемый номер
    static int curAlive; //текущее кол-во экземпляров данного класса
    int id;
    
    int *arr;
    
public:
    Object() 
    {
        id = nextId++;
        ++curAlive;
        arr = new int[10];
    }
    
    ~Object() 
    {
        --curAlive;
        delete[] arr;
    }
    
    void addOp(int a)
    {
        this->arr[1] = a;
    }
    
    void printOp()
    {
        for(int i = 0; i < 10; ++i)
            cout << this->arr[i] << " ";
        cout << endl << endl;
    }
    
    void print()
    {
        cout << "Объект №" << id << endl;
    }
    
    //статический метод выводит информацию по кол-ву объектов класса
    static void printTotalInfo()
    {
        cout << "Было создано " << nextId - 1 << " объектов. Сейчас активно:" << curAlive << endl;
    }
};
 
int Object::nextId = 1;
int Object::curAlive = 0;
 
class Complex : public Object
{
    float a, b;
    bool real;
 
public:
    
    Complex(float a, float b)
    {
        setA(a);
        setB(b);
        if (b == 0)
        {
            this->real = false;
        }
        else
        {
            this->real = true;
        }   
    }
    
    float getA()const { return a; }
    void setA(float a) { this->a = a; };
    float getB()const { return b; }
    void setB(float b) { this->b = b; };
    bool getReal() { return real; }
    
    void invComplex()
    {
        this->b = -b;
    }
    
    
    void revComplex()
    {
        float oldA = this->a;
        this->a = this->a / ((this->a * this->a) + (this->b * this->b));
        this->b = float(((-1 * this->b)) / ((oldA * oldA) + (this->b * this->b)));
    }
    
    
    void printAbout()
    {
        char sign;
    if (b < 0)
    {
        sign = '-';
    }
    else
    {
        sign = '+' ;
    }
    cout << "(" << a << " " << sign << " " << fabs(b) << " * i) ";
    if (real)
    {
        cout << "[complex number]" << endl; 
    }
    else
    {
        cout << "[real number]" << endl;    
    }
    }   
 
};
 
 
Complex operator+ (Complex& a, const Complex& b)
{
    a.addOp(1);
    return Complex { b.getA() + a.getA(), b.getB() + a.getB() };
}
 
Complex operator- (const Complex& a, const Complex& b)
{
    return Complex { a.getA() - b.getA(), a.getB() - b.getB() };
}
 
Complex operator* (const Complex& a, const Complex& b)
{
    return Complex { (a.getA() * b.getA()) - (a.getB() * b.getB()), (a.getA() * b.getB()) + (b.getA() * a.getB()) };
}
 
Complex operator/ (const Complex& a, const Complex& b)
{
    return Complex { ((a.getA() * b.getA()) + (a.getB() * b.getB())) / ((b.getA() * b.getA()) + (b.getB() * b.getB())), ((b.getA() * a.getB()) - (a.getA() * b.getB())) / ((b.getA() * b.getA()) + (b.getB() * b.getB())) };
}
 
 
 
 
int main()
{
    system("chcp 1251");
    Complex myA(1, 1);
    Complex myB(-2, -1);
    myA.printAbout();
    myB.printAbout();
    Complex myC = myA + myB;
    myC.printAbout();
    cout << endl;
    Object a, v, c;
    Object::printTotalInfo();
    Complex::printTotalInfo();
    
    //Complex:printOp(myA);
    
    return 0;
}
Добавлено через 56 минут

Так, ну вроде динамический массив, как поле, работает. В мейне могу задавать значение элементу массива. И выводить массив. Но все равно не понимаю, как я смогу в своих функциях менять значения элементов.

C++ (Qt)
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <iostream>
#include <math.h> 
using namespace std;
 
 
class Object
{
    static int nextId; // следующий присваиваемый номер
    static int curAlive; //текущее кол-во экземпляров данного класса
    int id;
    
    int* arr;
    
public:
    Object() 
    {
        id = nextId++;
        ++curAlive;
        arr = new int[10];
        for(int i = 0; i < 10; ++i)
            arr[i] = 0;
    }
    
    ~Object() 
    {
        --curAlive;
        delete[] arr;
    }
    
    void addOp(int a)
    {
        this->arr[1] = a;
    }
    
    void printOp()
    {
        for(int i = 0; i < 10; ++i)
            cout << this->arr[i] << " ";
        cout << endl << endl;
    }
    
    void print()
    {
        cout << "Объект №" << id << endl;
    }
    
    //статический метод выводит информацию по кол-ву объектов класса
    static void printTotalInfo()
    {
        cout << "Было создано " << nextId - 1 << " объектов. Сейчас активно:" << curAlive << endl;
    }
};
 
int Object::nextId = 1;
int Object::curAlive = 0;
 
class Complex : public Object
{
    float a, b;
    bool real;
 
public:
    
    Complex(float a, float b)
    {
        setA(a);
        setB(b);
        if (b == 0)
        {
            this->real = false;
        }
        else
        {
            this->real = true;
        }   
    }
    
    float getA()const { return a; }
    void setA(float a) { this->a = a; };
    float getB()const { return b; }
    void setB(float b) { this->b = b; };
    bool getReal() { return real; }
    
    void invComplex()
    {
        this->b = -b;
    }
    
    
    void revComplex()
    {
        float oldA = this->a;
        this->a = this->a / ((this->a * this->a) + (this->b * this->b));
        this->b = float(((-1 * this->b)) / ((oldA * oldA) + (this->b * this->b)));
    }
    
    
    void printAbout()
    {
        char sign;
    if (b < 0)
    {
        sign = '-';
    }
    else
    {
        sign = '+' ;
    }
    cout << "(" << a << " " << sign << " " << fabs(b) << " * i) ";
    if (real)
    {
        cout << "[complex number]" << endl; 
    }
    else
    {
        cout << "[real number]" << endl;    
    }
    }   
 
};
 
 
Complex operator+ (const Complex& a, const Complex& b)
{
    //a.addOp(1);
    return Complex { b.getA() + a.getA(), b.getB() + a.getB() };
}
 
Complex operator- (const Complex& a, const Complex& b)
{
    return Complex { a.getA() - b.getA(), a.getB() - b.getB() };
}
 
Complex operator* (const Complex& a, const Complex& b)
{
    return Complex { (a.getA() * b.getA()) - (a.getB() * b.getB()), (a.getA() * b.getB()) + (b.getA() * a.getB()) };
}
 
Complex operator/ (const Complex& a, const Complex& b)
{
    return Complex { ((a.getA() * b.getA()) + (a.getB() * b.getB())) / ((b.getA() * b.getA()) + (b.getB() * b.getB())), ((b.getA() * a.getB()) - (a.getA() * b.getB())) / ((b.getA() * b.getA()) + (b.getB() * b.getB())) };
}
 
 
 
 
int main()
{
    system("chcp 1251");
    Complex myA(1, 1);
    Complex myB(-2, -1);
    myA.printAbout();
    myB.printAbout();
    Complex myC = myA + myB;
    myC.printAbout();
    cout << endl;
    Object a, v, c;
    Object::printTotalInfo();
    Complex::printTotalInfo();
    
    //Complex:printOp(myA);
    myA.addOp(1);
    myA.printOp();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2022, 22:13
Ответы с готовыми решениями:

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

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

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

Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

4
171 / 111 / 65
Регистрация: 26.06.2020
Сообщений: 327
06.10.2022, 22:57 2
Если именно массив нужен, то:
C++
1
2
3
4
void addOp(int i)
{
        this->arr[i]++;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Complex operator+ (Complex& a, Complex& b)
{
    a.addOp(0);
    b.addOp(0);
    return Complex{ b.getA() + a.getA(), b.getB() + a.getB() };
}
 
Complex operator- (Complex& a, Complex& b)
{
    a.addOp(1);
    b.addOp(1);
    return Complex{ a.getA() - b.getA(), a.getB() - b.getB() };
}
И т.д.
0
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 265
06.10.2022, 23:06  [ТС] 3
ll45, мне немного не то нужно. Массив - список совершенных операций.

Сделали + массив стал [1, 0, 0 .. 0]
Сделали еще + массив стал [1, 1, 0...0]
Сделали - массив стал [1,1, 2 ... 0]

0
171 / 111 / 65
Регистрация: 26.06.2020
Сообщений: 327
06.10.2022, 23:48 4
Цитата Сообщение от billy121 Посмотреть сообщение
Массив - список совершенных операций.
Именно. По индексу 0 суммируются операции сложения, по индексу 1 суммируются операции вычитания, и т.д.
Цитата Сообщение от billy121 Посмотреть сообщение
Сделали + массив стал [1, 0, 0 .. 0]
Сделали ещё +, массив стал [2, 0, 0, 0...], сделали -, массив стал [2, 1, 0, ...]. При выводе перебираешь массив по индексам и выводишь: каких и сколько операций с объектом было сделано.
0
фрилансер
5841 / 5368 / 1102
Регистрация: 11.10.2019
Сообщений: 14,336
07.10.2022, 07:41 5
billy121, используй вектор

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
#include <cmath> 
#include <vector> 
 
using std::cout;
using std::endl;
 
class Object
{
    inline static int nextId=1; // следующий присваиваемый номер
    inline static int curAlive; //текущее кол-во экземпляров данного класса
 
    int id{};
    std::vector<int> arr;
    
public:
 
    Object& operator=(const Object&)=delete;
    Object& operator=(Object&&)=delete;
    Object(const Object&)=delete;
    Object(Object&&)=delete;
    
    Object():id{nextId++}
    {
        curAlive++;
        arr.resize(10);
    }
    
    ~Object() 
    {
        curAlive--;
    }
    
    void addOp(int a)
    {
        if(arr.size()>1)
        {
            arr[1] = a;
        }
    }
    
    void printOp()
    {
        for(const auto& i:arr)
        {
            cout << i << " ";
        }
        cout << endl << endl;
    }
    
    void print()
    {
        cout << "Объект №" << id << endl;
    }
    
    //статический метод выводит информацию по кол-ву объектов класса
    static void printTotalInfo()
    {
        cout << "Было создано " << nextId - 1 << " объектов. Сейчас активно:" << curAlive << endl;
    }
};
 
class Complex : public Object
{
public:
    float a{}, b{};
    bool real{};
 
public:
    
    Complex(float a, float b)
    {
        this->a=a;
        this->b=b;
        if (b == 0)
        {
            real = false;
        }
        else
        {
            real = true;
        }   
    }
    
    void invComplex()
    {
        b = -b;
    }
 
    void revComplex()
    {
        float oldA = a;
        a = a / (a*a + b*b);
        b = -b / (oldA*oldA + b*b);
    }
    
    
    void printAbout()
    {
        char sign;
        if (b < 0)
        {
            sign = '-';
        }
        else
        {
            sign = '+' ;
        }
        cout << "(" << a << " " << sign << " " << fabs(b) << " * i) ";
        if (real)
        {
            cout << "[complex number]" << endl; 
        }
        else
        {
            cout << "[real number]" << endl;    
        }
    }   
    
    friend Complex operator+ (Complex& a, const Complex& b)
    {
        a.addOp(1);
        return Complex { b.a + a.a, b.b + a.b };
    }
     
    friend Complex operator- (const Complex& a, const Complex& b)
    {
        return Complex { a.a - b.a, a.b - b.b };
    }
     
    friend Complex operator* (const Complex& a, const Complex& b)
    {
        return Complex { a.a * b.a - a.b * b.b, a.a * b.b + b.a * a.b };
    }
     
    friend Complex operator/ (const Complex& a, const Complex& b)
    {
        return Complex { (a.a * b.a + a.b * b.b) / (b.a * b.a + b.b * b.b), (b.a * a.b - a.a * b.b) / (b.a * b.a + b.b * b.b) };
    }
};
 
 
int main()
{
    system("chcp 1251");
    Complex myA(1, 1);
    Complex myB(-2, -1);
    myA.printAbout();
    myB.printAbout();
    Complex myC = myA + myB;
    myC.printAbout();
    cout << endl;
    Object a, v, c;
    Object::printTotalInfo();
    Complex::printTotalInfo();
    
    return 0;
}

Добавлено через 38 секунд
ещё чуток от мусора почистил

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Object& operator=(const Object&)=delete;
    Object& operator=(Object&&)=delete;
    Object(const Object&)=delete;
    Object(Object&&)=delete;
а это - я поленился расписывать, поэтому пока удалил
0
07.10.2022, 07:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2022, 07:41
Помогаю со студенческими работами здесь

Как создать динамический массив объектов базового класса и заполнить его наследниками базового класса?
#include &lt;iostream&gt; using namespace std; class P { int p; public: P() {

Как правильно инициализировать динамический массив пользовательского класса
Допустим есть класс: class A { public: A(); A(int a, int b, int c) {} }; и нам нужно...

Массив как поле класса
Например, имеется класс с полем массивом размерностью 10 на 10. class massiv { private: int mas;...

Массив, как поле данных класса
Как правильно обьявить массив char как элемент данных класса и проинициализировать его нулями в...

Как правильно записывать в динамический массив типа класса обьекты? вот банальный пример
#pragma once #include &quot;iostream&quot; namespace Program { class Book { typedef unsigned int...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru