Форум программистов, компьютерный форум CyberForum.ru

Написать класс Матрица. Массив объектов класса Массив - C++

Восстановить пароль Регистрация
 
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
20.06.2016, 10:25     Написать класс Матрица. Массив объектов класса Массив #1
Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего задания).
В классе реализовать следующие методы:
конструкторы (по умолчанию, с параметрами); деструктор; ввод с клавиатуры, вывод на экран (в виде методов). В этом же классе, перегрузить операции: +, += (сложение матриц); – (вычитание); = (присвоение); == (сравнение по элементам);
[] (взятие элемента с заданным индексом).

В общем застрял на присвоении. Помогите пожалуйста реализовать программу.
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
#include <iostream>
#include <ctime>
#include <iomanip>
 
#define PI 3.1415956535
 
using namespace std;
 
class Matrix;
 
class Array
{
public:
    int x[5];
    Array(){
        for (int i = 0; i < 5; i++){
            x[i] = rand() % 21 - 10;
            //cout << x[i] << setw(4);
        }
        //cout << endl;
    }
 
    int& operator [](int i)
    {
        return x[i];
    }
    friend Matrix;
};
 
 
 
class Matrix
{
 
public:
    Array y[5];
    Matrix(){
 
        //y[0][0] = 1;
        //cout << y[0][0];
    }
 
    void show(){
        for (int i = 0; i < 5; i++){
            for (int j = 0; j < 5; j++){
                cout << setw(4) << y[i][j];
            }
            cout << endl;
        }
        cout << endl;
    }
 
    void edit(int a, int b){
        cin >> y[a][b];
    }
 
    Array& operator [](int i)
    {
        return y[i];
    }
 
    Matrix &operator +(Matrix N)
    {
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                temp[i][j] = N.y[i][j] + y[i][j];
            }
        }
        return temp;
    }
 
    Matrix &operator -(Matrix N)
    {
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                temp[i][j] = N.y[i][j] - y[i][j];
            }
        }
        return temp;
    }
    
    bool operator ==(Matrix N)
    {
        bool k=1;
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                if (N.y[i][j] != y[i][j]){
                    k = 0;
                }
            }
        }
        return k;
    }
    
    /*
    //???????
    //не работает
    Matrix &operator =(Matrix N)
    {
        int i, j;
        Matrix temp;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                temp[i][j] = N.y[i][j];
            }
        }
        return temp;
    }*/
 
};
 
void main(){
    srand(time(NULL));
    Matrix m, n, r;
    m.show();
    cout << (m == m);
    //r.show();
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2016, 10:25     Написать класс Матрица. Массив объектов класса Массив
Посмотрите здесь:

C++ Массив объектов класса Word
Массив объектов класса C++
Массив объектов класса C++
Написать класс «множество» – наследник класса «массив» C++
Массив объектов класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
20.06.2016, 11:26     Написать класс Матрица. Массив объектов класса Массив #2
C++
1
2
3
4
5
6
7
8
9
10
Matrix &operator =(Matrix N)
    {
        int i, j;
        for (i = 0; i < 5; i++){
            for (j = 0; j < 5; j++){
                y[i][j] = N.y[i][j];
            }
        }
        return *this;
    }
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
20.06.2016, 16:39  [ТС]     Написать класс Матрица. Массив объектов класса Массив #3
return *this; Что это означает?
nstwf
86 / 76 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
20.06.2016, 16:53     Написать класс Матрица. Массив объектов класса Массив #4
Цитата Сообщение от Jman Посмотреть сообщение
return *this; Что это означает?
возвращает
C++
1
Matrix &operator
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
20.06.2016, 17:44  [ТС]     Написать класс Матрица. Массив объектов класса Массив #5
Спасибо. Подскажите пожалуйста, я сделал прототип методов и перегрузок. Но ругается на вот такое:
C++ (Qt)
1
2
3
4
Array& operator [](int i)
    {
        return y[i];
    }
Делаю
C++
1
Array& operator [](int i);
Выношу под класс:
C++
1
2
3
4
Array& :: operator [](int i)
    {
        return y[i];
    }
Ругается... Как правильно это вынести?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
20.06.2016, 22:59     Написать класс Матрица. Массив объектов класса Массив #6
Цитата Сообщение от Jman Посмотреть сообщение
Array& :: operator [](int i)
Array& Matrix::operator [](int i)
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
21.06.2016, 15:45  [ТС]     Написать класс Матрица. Массив объектов класса Массив #7
Спасибо получилось.
Добавлено через 2 часа 3 минуты
Народ подскажите, как правильно вывести в мейне все операции над матрицей. Сложение, вычитание, индексацию и тд...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
switch (menu_switch)
    {
        case 1:
        {   // перегурзка +
            SUM = FIRST + SECOND;
            SUM.Print();        
        }
        
        case 2:
        {
            SUB = FIRST - SECOND;
            SUB.Print();        // перегрузка -
        }
        
        case 3:
        {
            cout << a[0][0];
        }
    }
Пока дошел до такого...

Добавлено через 2 часа 13 минут
Помогите так же, как можно реализовать деструктор, сделал вот так:
C++
1
2
3
4
5
Matrix::~Matrix()
{
    cout << "Удаляем массив" << endl;
    delete [] MYMATRIX;
}
Не работает... Кажется потому, что не выделил память... Не знаю в общем нарвался на такие моменты. Помогите пожалуйста. Задачу почти решил..
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
21.06.2016, 21:15     Написать класс Матрица. Массив объектов класса Массив #8
Цитата Сообщение от Jman Посмотреть сообщение
как можно реализовать деструктор
Если ты нигде не используешь new, то никаких delete обычно в деструкторе быть не должно.
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
21.06.2016, 21:34  [ТС]     Написать класс Матрица. Массив объектов класса Массив #9
По заданию есть деструкторе. Но я не пойму, где нужно правильно выделить память, а потом в деструкторе ее очистить. Предполагаю что в классе Matrix нужно проделать некое такое:
C++
1
2
3
4
5
6
class Matrix
{
 
public:
    Array y = new int [5];
    Matrix();
~Matrix()
{
cout << "Удаляем массив" << endl;
delete [] Array;
}
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
22.06.2016, 01:59     Написать класс Матрица. Массив объектов класса Массив #10
Array y = new int [5];
C++
1
Array *y;
и в конструкторе:
C++
1
y = new Array[5];
а в деструкторе:
C++
1
delete[] y;
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
22.06.2016, 10:32  [ТС]     Написать класс Матрица. Массив объектов класса Массив #11
Сделал так в хедере:
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
#pragma once
#include <iostream>
#include <iomanip>
using namespace std;
 
class Matrix;
 
class Array
{
public:
    int MYARR[5];
    Array();
    int& operator [](int i);    //заполняем одномерный массив
    friend Matrix;
};
 
class Matrix
{
 
public:
    Array *MYMATRIX;
    Matrix();
    ~Matrix();
    void Message();
    void Print();
    void Edit(int a, int b);
    Array& operator [](int i);
    Matrix &operator +(Matrix N);
    Matrix &operator -(Matrix N);
    bool operator ==(Matrix N);
    Matrix &operator =(Matrix N);
};
Описание класса:
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
#include "MyArr.h"
#include <iomanip>
 
//***************************************** Описание прототипов *************************************//
// конструктор 
Array::Array()
{
    for (int i = 0; i < 5; i++)
    {
        MYARR[i] = rand() % 20;
    }
}
 
Matrix::Matrix()
{
    MYMATRIX = new Array[5];
}
 
int& Array :: operator [](int i)
{
    return MYARR[i];
}
//перегрузка индексирования
Array& Matrix::operator [](int i)
{
    return MYMATRIX[i];
}
//перегрузка оператора сложения
Matrix &Matrix :: operator +(Matrix N)
{
    Matrix BUFFER;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            BUFFER[i][j] = N.MYMATRIX[i][j] + MYMATRIX[i][j];
        }
    }
    return BUFFER;
}
// перегружаем оператор вычитанием
Matrix &Matrix :: operator -(Matrix N)
{
    Matrix BUFFER;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            BUFFER[i][j] = N.MYMATRIX[i][j] - MYMATRIX[i][j];
        }
    }
    return BUFFER;
}
 
//перегружаем сравнение по элементам
bool Matrix :: operator ==(Matrix N)
{
    bool ASSIGMENT = true;
    //Matrix BUFFER;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (N.MYMATRIX[i][j] != MYMATRIX[i][j])
            {
                ASSIGMENT = false;
            }
        }
    }
    return ASSIGMENT;
}
//перегружаем оператор присвоения возвращаем Matrix &operator
Matrix &Matrix :: operator =(Matrix N)
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            MYMATRIX[i][j] = N.MYMATRIX[i][j];
        }
    }
    return *this;
}
//удаляем массив
Matrix::~Matrix()
{
    cout << "Удаляем массив" << endl;
    delete [] MYMATRIX;
}
//сообщение при старте программы
void Matrix::Message()
{
    cout << "================= Реализация класса "Матрица" =================\n"
        << " * В классе реализовать следующие методы:\n"
        << " * конструкторы (по умолчанию, с параметрами);\n"
        << " * деструктор;\n"
        << " * ввод с клавиатуры, вывод на экран (в виде методов).\n"
        << " * В этом же классе, перегрузить операции:\n"
        << " * +, += (сложение матриц);\n"
        << " * – (вычитание);\n"
        << " * = (присвоение);\n"
        << " * == (сравнение по элементам);\n"
        << " * [] (взятие элемента с заданным индексом)." << endl;
    
    cout << "                       Выберите операцию                        \n"
        << "1....Сложение матриц\n"
        << "2....Вычитание матриц\n"
        << "3....Присвоение матриц\n"
        << "4....Сравнение матриц по элементам\n"
        << "5....Взятие элемента с заданным адресом\n"
        << "6....Вывод матрицы а\n" 
        << "7....Вывод матрицы b\n" << endl;
    
}
//метод вывода матрицы
void Matrix::Print()
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            cout << setw(4) << MYMATRIX[i][j];
        }
        cout << endl;
    }
    cout << endl;
}
// изменение элементов матрицы
void Matrix::Edit(int a, int b)
{
    cin >> MYMATRIX[a][b];
}
Вылезает ошибка: MyMatrixClass_21.06.2016.exe вызвал срабатывание точки останова.
C++
1
2
3
4
5
6
7
8
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}
Мне кажется, что я не верно использую конструктор... Выбираю метод сложения матриц например. Вижу как в консоле срабатывает деструктор 3 раза и прога крешится.
Ткните пожалуйста, куда копать?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
22.06.2016, 10:51     Написать класс Матрица. Массив объектов класса Массив #12
Цитата Сообщение от Jman Посмотреть сообщение
Ткните пожалуйста, куда копать?
Ну, предположу, что как минимум помимо обычного конструктора тебе нужен конструктор копирования.
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
22.06.2016, 11:44  [ТС]     Написать класс Матрица. Массив объектов класса Массив #13
Вот так компилится и вроде работает:
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
// конструктор 
Array::Array()
{
    for (int i = 0; i < 5; i++)
    {
        MYARR[i] = rand() % 20;
    }
}
// конструктор Matrix
Matrix::Matrix()
{
    MYMATRIX = new Array[5];
}
//конструктор копирования
Matrix::Matrix(const Matrix &obj)
{
    MYMATRIX = new Array[5];
    //cout << "\nКонструктор копирования\n";
}
//деструктор
Matrix::~Matrix()
{
    delete[] MYMATRIX;
    cout << "\n Очищаем память \n";
}
Верное - ли это решение задачи?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
22.06.2016, 12:25     Написать класс Матрица. Массив объектов класса Массив #14
Цитата Сообщение от Jman Посмотреть сообщение
Верное - ли это решение задачи?
Конструктор копирования должен копировать.
Jman
 Аватар для Jman
27 / 27 / 3
Регистрация: 11.10.2015
Сообщений: 272
Завершенные тесты: 1
22.06.2016, 19:18  [ТС]     Написать класс Матрица. Массив объектов класса Массив #15
Копировать сам конструктор? Какой в данном случае?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 19:25     Написать класс Матрица. Массив объектов класса Массив
Еще ссылки по теме:

Массив объектов класса C++
Шаблонный массив объектов класса C++
Массив объектов класса C++

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

Или воспользуйтесь поиском по форуму:
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
22.06.2016, 19:25     Написать класс Матрица. Массив объектов класса Массив #16
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Конструктор копирования должен копировать.
Конструктор копирования должен копировать содержимое одного объекта в текущий.
В твоем случае - из переданной матрицы в текущую матрицу.
Yandex
Объявления
22.06.2016, 19:25     Написать класс Матрица. Массив объектов класса Массив
Ответ Создать тему
Опции темы

Текущее время: 12:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru