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

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

15.01.2014, 15:23. Показов 1060. Ответов 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();
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2014, 15:23
Ответы с готовыми решениями:

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

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

Не могу разобраться с классами и объектами
Доброго всем и прочего. Вот решил изменить 1С и перешел на шарп. Собственно пытаюсь перелить проект, работающий на 1С 8.2 в...

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
15.01.2014, 16:05
C++
1
2
3
4
5
void summ(matrix& a)//операция суммирования матриц
// ...
 
void razn(matrix& a)//операция разности матриц
// ...
Как говорится, найди отличие...
1
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
15.01.2014, 16:20
У меня ошибок не выдает
Кликните здесь для просмотра всего текста
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;
}


Результат
Миниатюры
Не могу разобраться с классами и освобождением памяти  
1
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
15.01.2014, 16:55
так вы в функциях работаете не с объектом непосредственно, а с его копией, и вызывается конструктор копирования по умолчанию - неявный, который копирует только указатель, и десутруктор для копии, который после окончания функции удалят то, что находится по указателю копии(а там лежит собственно объект). Т.е. вам надо либо работать с самим объектом, либо сделать более глубокий конструктор копирования, который бы копировал не только указатель но и сами данные.
по идее так.
Ну и UI по идее это имеет ввиду указав имперсанд
1
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 2
15.01.2014, 22:56  [ТС]
egor2116, ошибки то не выдает но в рез-те вычисления 1,14318Е неверно)
dzrkot, UI, спасибо! А то я уже совсем подвис в этом месте, реализовал даж метод доступа к данным, чтоб обойти косяк - но это некошерно)...а все было на поверхности, видимо намылил глаза... Спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2014, 22:56
Помогаю со студенческими работами здесь

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

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

Ошибка в функции с освобождением памяти
Здравствуйте. Столкнулся с такой ошибкой: &quot;C4700 использована неинициализированная локальная переменная &quot;mas&quot;&quot;. //при...

Удаление задачи с освобождением памяти
Привет! На стм32 стоит FriiRTOS, использует схему heap_2. Часто создаются и удаляются задачи (все они с одним размером). Проблема в том,...

С++ В каких случаях нужно заниматься освобождением памяти?
Я так понял в СИ и С++ нужно освобождать память когда создаешь массивы и указатели? Напишите список в каких случаях нужно этим...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru