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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Jman
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
#1

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

20.06.2016, 10:25. Просмотров 293. Ответов 15
Метки нет (Все метки)

Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего задания).
В классе реализовать следующие методы:
конструкторы (по умолчанию, с параметрами); деструктор; ввод с клавиатуры, вывод на экран (в виде методов). В этом же классе, перегрузить операции: +, += (сложение матриц); – (вычитание); = (присвоение); == (сравнение по элементам);
[] (взятие элемента с заданным индексом).

В общем застрял на присвоении. Помогите пожалуйста реализовать программу.
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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
879 / 618 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
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
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
20.06.2016, 16:39  [ТС]     Написать класс Матрица. Массив объектов класса Массив #3
return *this; Что это означает?
nstwf
87 / 77 / 30
Регистрация: 19.02.2016
Сообщений: 324
Завершенные тесты: 1
20.06.2016, 16:53     Написать класс Матрица. Массив объектов класса Массив #4
Цитата Сообщение от Jman Посмотреть сообщение
return *this; Что это означает?
возвращает
C++
1
Matrix &operator
Jman
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
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
879 / 618 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
20.06.2016, 22:59     Написать класс Матрица. Массив объектов класса Массив #6
Цитата Сообщение от Jman Посмотреть сообщение
Array& :: operator [](int i)
Array& Matrix::operator [](int i)
Jman
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
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
879 / 618 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
21.06.2016, 21:15     Написать класс Матрица. Массив объектов класса Массив #8
Цитата Сообщение от Jman Посмотреть сообщение
как можно реализовать деструктор
Если ты нигде не используешь new, то никаких delete обычно в деструкторе быть не должно.
Jman
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
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
879 / 618 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
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
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
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
879 / 618 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
22.06.2016, 10:51     Написать класс Матрица. Массив объектов класса Массив #12
Цитата Сообщение от Jman Посмотреть сообщение
Ткните пожалуйста, куда копать?
Ну, предположу, что как минимум помимо обычного конструктора тебе нужен конструктор копирования.
Jman
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
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
879 / 618 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
22.06.2016, 12:25     Написать класс Матрица. Массив объектов класса Массив #14
Цитата Сообщение от Jman Посмотреть сообщение
Верное - ли это решение задачи?
Конструктор копирования должен копировать.
Jman
41 / 41 / 10
Регистрация: 11.10.2015
Сообщений: 409
Завершенные тесты: 2
22.06.2016, 19:18  [ТС]     Написать класс Матрица. Массив объектов класса Массив #15
Копировать сам конструктор? Какой в данном случае?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 19:25     Написать класс Матрица. Массив объектов класса Массив
Еще ссылки по теме:
Массив объектов класса C++
Массив объектов класса C++
Шаблонный массив объектов класса C++
C++ Динамический массив объектов класса
C++ Массив объектов класса Word

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru