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

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

Войти
Регистрация
Восстановить пароль
 
striderghost
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 2
#1

Не могу разобраться с классами и освобождением памяти - C++

15.01.2014, 15:23. Просмотров 309. Ответов 4
Метки нет (Все метки)

Есть задача. Создать класс матрица Данный класс содержит указатель на float, размер строк и столбцов и состояние ошибки. Определить конструктор без параметров, конструктор с одним параметром и конструктор с двумя параметрами, деструктор. Определить методы доступа: возвращать значение элемента (i,j) и адрес этого элемента. Определить функцию печати. Определить функции сложения и вычитания (матрицы с матрицей), умножение матрицы на матрицу. Определить умножение матрицы на число. Проверить работу этого класса. В случае нехватки памяти, несоответствия размерностей, выхода за пределы устанавливать код ошибки.

Собственно проблема в том, что при обращении к функции сложения(и вычитания), которой в параметрах передается экземпляр этого класса (void summ(matrix a)), срабатывает деструктор, в котором я удаляю m_matrix, и соответственно, все дальнейшие манипуляции с объектами m_matrix не имеют смысла. То ли я неправильно выделяю память, то ли неправильно очищаю, то ли лыжи не едут...помогите. И не судите строго только начал изучать си
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <conio.h>
#include <iomanip> //нужен для setw
using namespace std;
 
class matrix
{
private:
    float *m_matrix; //указатель на матрицу, которая выглядит как массив row1, row2,...,rown,col1,col2,...colm
    int row;
    int col;
    static int err;
    
public:
    matrix():row(1),col(1)      //конструктор без параметров (по умолчанию 1х1 заполненная нулями)
    {
 
        m_matrix=new float[row*col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        *(m_matrix+i*col+j)=0.0;
    }
        matrix(int x): row(x), col(x)//конструктор с 1 параметром 
    {
        m_matrix=new float[row*col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        *(m_matrix+i*col+j)=j+i;
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                *(m_matrix+i*col+j) = 0.0;
    }
    matrix(int _row,int _col): row(_row), col(_col)//конструктор с 2 параметрами
    {
        m_matrix=new float[row*col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        *(m_matrix+i*col+j)=j+i;
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                *(m_matrix+i*col+j) = 0.0;
    }
    ~matrix()//деструктор
    {       
        delete[] m_matrix;//собсно косячит тут
    }
    //доступ к элементу матрицы
    float &Elem(int i,int j)
    {
        return *(m_matrix+i*col+j);
    }
    //перезагрузка операции () для более удобного доступа к элементу матрицы
    float &operator ()(int i,int j)
    {
        return Elem(i,j);
    }
    void outMatrix()//операция вывода матрицы
    {
        for(int i = 0; i < row; ++i)
        {
            cout<<"[ ";
            for(int j = 0; j < col; ++j)
                cout<<setw(5)<<setiosflags(ios::left)<<*(m_matrix+i*col+j)<<" ";
            cout<<"]"<<endl;
        }
    }
    void summ(matrix a)//операция суммирования матриц
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
            {
                this->Elem(i,j)=*(m_matrix+i*col+j)+a.Elem(i,j);
            }
    }
    void umn(int a)//операция умножения матрицы на число
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                this->Elem(i,j)=*(m_matrix+i*col+j)*a;
    }
    void razn(matrix a)//операция разности матриц
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                this->Elem(i,j)=*(m_matrix+i*col+j)-a.Elem(i,j);
    }
    void random()//операция рандомного заполнения матрицы
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
            {
                this->Elem(i,j) = rand()%101;
            }
    }
    
};
 
void main()
{
    setlocale(LC_ALL, ".1251");
    system("cls");
    matrix mat2(2,3);
    matrix mat1(5);
    matrix mat0;
    mat2.Elem(1,2) = 15.3;
    mat1(2,3) = 4;
    cout<<mat2.Elem(1,2)<<endl;
    cout<<mat1(2,3)<<endl;
    cout<<"matrix mat0 out (создана по конструктору без параметров):"<<endl;
    mat0.outMatrix();
    cout<<endl<<"matrix mat1(5) out (создана по конструктору с 1 параметром):"<<endl;
    mat1.outMatrix();
    cout<<"matrix mat2(2,3)  out (создана по конструктору с 2 параметрами):"<<endl;
    mat2.outMatrix();
    matrix mat4(4,4);
    mat4.random();
    cout<<"matrix mat4 out :"<<endl;
    mat4.outMatrix();
    matrix mat5(4,4);
    mat5.random(); 
    cout<<"matrix mat5 out :"<<endl;
    mat5.outMatrix();
    mat4.summ(mat5);
    cout<<endl<<"matrix mat4+mat5 out (сумма двух матриц):"<<endl;
    mat4.outMatrix();
    mat5.razn(mat4);
    cout<<endl<<"matrix mat5-mat4 out (разность двух матриц):"<<endl;
    mat5.outMatrix();
    mat4.umn(2);
    cout<<endl<<"matrix mat4*2 out (умножение матрицы на число):"<<endl;
    mat4.outMatrix();
    getch();
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2014, 15:23     Не могу разобраться с классами и освобождением памяти
Посмотрите здесь:

Не могу разобраться с классами - C++
InitD3DWindow.h ------------------- class InitD3DWindow { protected: //Initialize the app Window bool InitWindow();

Не могу разобраться с функциями и классами - C++
Уважаемые гуру! Подскажите, пожалуйста, мне такой вопрос. Пишу небольшое консольное приложение-игру. Есть у меня класс Character, с...

Проблаем с освобождением памяти - C++
Работаю в Visual Studio C++ Express написал вот такой простой код: int main(){ char *n; n=new char; n=&quot;Text&quot;; delete n; ...

Проблемы с delete [], программа периодически аварийно завершается на строке с освобождением памяти. - C++
Добрый день! Столкнулся со следующей задачей: в программе требуется довольно часто изменять размеры массива, для чего использую...

Не могу разобраться с указателями(не понимаю сути освобождения памяти) - C++
Вот я тоже дуб в указателях... помогите пожалуйста кому не лениво... с горем пополам заработал Enter (ноуту пора в утиль), и вот (вопросы...

Помогогите разобраться с классами - C++
Прошу доступно объяснить: частные и общие данные, конструктор, деструктор, перегрузка операторов, наследование, на основе этого кода....

Попытка разобраться с классами в C++ - C++
Доброго времени суток Читаю книгу Дейтел С++ дошел до классов и в первом же упражнении впал в ступор Помогите кто чем сможет Текст...

Утечка памяти в работе с классами - C++
вроде утечка памяти наблюдается в функции &quot;loadfromfile&quot;, помогите пожалуйста исправить #include &quot;stdafx.h&quot; #include &lt;windows.h&gt; ...

Динамическая память, проблемы с освобождением - C++
Всем привет! Проблема стара как этот мир, но есть некая отличительная черта по которой я создал эту тему. Задача следующая. Создаю файл...

Не могу разобраться с задачками - C++
Здраствуйте все. я не могу понять как сделать эти задачки Мне надо их через массивы сделать и на языке Си Помогите пожалуйста буду...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23223 / 15214 / 4416
Регистрация: 22.10.2011
Сообщений: 27,044
Записей в блоге: 4
15.01.2014, 16:05     Не могу разобраться с классами и освобождением памяти #2
C++
1
2
3
4
5
void summ(matrix& a)//операция суммирования матриц
// ...
 
void razn(matrix& a)//операция разности матриц
// ...
Как говорится, найди отличие...
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
15.01.2014, 16:20     Не могу разобраться с классами и освобождением памяти #3
У меня ошибок не выдает
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
class matrix
{
private:
    float *m_matrix; //ГіГЄГ*Г§Г*òåëü Г*Г* Г¬Г*òðèöó, êîòîðГ*Гї âûãëÿäèò ГЄГ*ГЄ Г¬Г*Г±Г±ГЁГў row1, row2,...,rown,col1,col2,...colm
    int row;
    int col;
    static int err;
    
public:
    matrix():row(1),col(1)      //ГЄГ®Г*ñòðóêòîð ГЎГҐГ§ ГЇГ*Г°Г*ìåòðîâ (ГЇГ® óìîë÷Г*Г*ГЁГѕ 1Гµ1 Г§Г*ïîëГ*ГҐГ*Г*Г*Гї Г*óëÿìè)
    {
 
        m_matrix=new float[row*col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        *(m_matrix+i*col+j)=0.0;
    }
        matrix(int x): row(x), col(x)//ГЄГ®Г*ñòðóêòîð Г± 1 ГЇГ*Г°Г*ìåòðîì 
    {
        m_matrix=new float[row*col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        *(m_matrix+i*col+j)=j+i;
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                *(m_matrix+i*col+j) = 0.0;
    }
    matrix(int _row,int _col): row(_row), col(_col)//ГЄГ®Г*ñòðóêòîð Г± 2 ГЇГ*Г°Г*ìåòðГ*ìè
    {
        m_matrix=new float[row*col];
        for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
        *(m_matrix+i*col+j)=j+i;
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                *(m_matrix+i*col+j) = 0.0;
    }
    ~matrix()//äåñòðóêòîð
    {       
        delete[] m_matrix;//ñîáñГ*Г® êîñÿ÷èò ГІГіГІ
    }
    //äîñòóï ГЄ ýëåìåГ*ГІГі Г¬Г*òðèöû
    float &Elem(int i,int j)
    {
        return *(m_matrix+i*col+j);
    }
    //ïåðåçГ*ãðóçêГ* îïåðГ*öèè () äëÿ áîëåå óäîáГ*îãî äîñòóïГ* ГЄ ýëåìåГ*ГІГі Г¬Г*òðèöû
    float &operator ()(int i,int j)
    {
        return Elem(i,j);
    }
    void outMatrix()//îïåðГ*öèÿ âûâîäГ* Г¬Г*òðèöû
    {
        for(int i = 0; i < row; ++i)
        {
            cout<<"[ ";
            for(int j = 0; j < col; ++j)
                cout<<setw(5)<<setiosflags(ios::left)<<*(m_matrix+i*col+j)<<" ";
            cout<<"]"<<endl;
        }
    }
    void summ(matrix a)//îïåðГ*öèÿ ñóììèðîâГ*Г*ГЁГї Г¬Г*òðèö
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
            {
                this->Elem(i,j)=*(m_matrix+i*col+j)+a.Elem(i,j);
            }
    }
    void umn(int a)//îïåðГ*öèÿ ГіГ¬Г*îæåГ*ГЁГї Г¬Г*òðèöû Г*Г* ÷èñëî
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                this->Elem(i,j)=*(m_matrix+i*col+j)*a;
    }
    void razn(matrix a)//îïåðГ*öèÿ Г°Г*Г§Г*îñòè Г¬Г*òðèö
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
                this->Elem(i,j)=*(m_matrix+i*col+j)-a.Elem(i,j);
    }
    void random()//îïåðГ*öèÿ Г°Г*Г*äîìГ*îãî Г§Г*ïîëГ*ГҐГ*ГЁГї Г¬Г*òðèöû
    {
        for(int i = 0; i < row; ++i)
            for(int j = 0; j < col; ++j)
            {
                this->Elem(i,j) = rand()%101;
            }
    }
    
};
 
int main()
{
   matrix mat2(2,3);
    matrix mat1(5);
    matrix mat0;
    mat2.Elem(1,2) = 15.3;
    mat1(2,3) = 4;
    cout<<mat2.Elem(1,2)<<endl;
    cout<<mat1(2,3)<<endl;
    cout<<"matrix mat0 out (ñîçäГ*Г*Г* ГЇГ® ГЄГ®Г*ñòðóêòîðó ГЎГҐГ§ ГЇГ*Г°Г*ìåòðîâ):"<<endl;
    mat0.outMatrix();
    cout<<endl<<"matrix mat1(5) out (ñîçäГ*Г*Г* ГЇГ® ГЄГ®Г*ñòðóêòîðó Г± 1 ГЇГ*Г°Г*ìåòðîì):"<<endl;
    mat1.outMatrix();
    cout<<"matrix mat2(2,3)  out (ñîçäГ*Г*Г* ГЇГ® ГЄГ®Г*ñòðóêòîðó Г± 2 ГЇГ*Г°Г*ìåòðГ*ìè):"<<endl;
    mat2.outMatrix();
    matrix mat4(4,4);
    mat4.random();
    cout<<"matrix mat4 out :"<<endl;
    mat4.outMatrix();
    matrix mat5(4,4);
    mat5.random(); 
    cout<<"matrix mat5 out :"<<endl;
    mat5.outMatrix();
    mat4.summ(mat5);
    cout<<endl<<"matrix mat4+mat5 out (ñóììГ* äâóõ Г¬Г*òðèö):"<<endl;
    mat4.outMatrix();
    mat5.razn(mat4);
    cout<<endl<<"matrix mat5-mat4 out (Г°Г*Г§Г*îñòü äâóõ Г¬Г*òðèö):"<<endl;
    mat5.outMatrix();
    mat4.umn(2);
    cout<<endl<<"matrix mat4*2 out (ГіГ¬Г*îæåГ*ГЁГҐ Г¬Г*òðèöû Г*Г* ÷èñëî):"<<endl;
    mat4.outMatrix();
     
  system("PAUSE");
  return 0;
}


Результат
Миниатюры
Не могу разобраться с классами и освобождением памяти  
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
15.01.2014, 16:55     Не могу разобраться с классами и освобождением памяти #4
так вы в функциях работаете не с объектом непосредственно, а с его копией, и вызывается конструктор копирования по умолчанию - неявный, который копирует только указатель, и десутруктор для копии, который после окончания функции удалят то, что находится по указателю копии(а там лежит собственно объект). Т.е. вам надо либо работать с самим объектом, либо сделать более глубокий конструктор копирования, который бы копировал не только указатель но и сами данные.
по идее так.
Ну и UI по идее это имеет ввиду указав имперсанд
striderghost
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 2
15.01.2014, 22:56  [ТС]     Не могу разобраться с классами и освобождением памяти #5
egor2116, ошибки то не выдает но в рез-те вычисления 1,14318Е неверно)
dzrkot, UI, спасибо! А то я уже совсем подвис в этом месте, реализовал даж метод доступа к данным, чтоб обойти косяк - но это некошерно)...а все было на поверхности, видимо намылил глаза... Спасибо большое!
Yandex
Объявления
15.01.2014, 22:56     Не могу разобраться с классами и освобождением памяти
Ответ Создать тему
Опции темы

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