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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ C++ WMI и реестр http://www.cyberforum.ru/cpp-beginners/thread1072131.html
Доброго времени суток! Требуется разъяснение по следующему вопросу: необходимо изменить значение одного ключа в реестре по средствам WMI (с ним знаком очень поверхность, буквально первый день, но не суть). Хотелось бы попробовать решить данную задачу на C++. То есть написать консольное приложение на срр прикрутив в него wmi. Вопрос в том что для этого надо- какие хедеры инклудить хотя бы...
C++ Реализовать функции Реализовать функции: EventsGenerators::EventsGenerators(void); void EventsGenerators::PlanNewEvent(EventsServers *EvServer, unsigned EvTime);буду очень признателен за комментарии))) http://www.cyberforum.ru/cpp-beginners/thread1072120.html
C++ Реализуйте и протестируйте итерационную функцию
Реализуйте и протестируйте итерационную функцию template <class T> int NodeLevel(const BinSTree<T> &T, const T& elem); которая определяет глубину узла с данными elem на бинарном дереве поиска и возвращает –1, если такого узла нет на дереве очень прошу с комментариями)
C++ Выбивает все время одну и ту же ошибку
Добрый день. В моем проекте есть абстрактный базовый класс, от него два производных. Когда я пытаюсь создать объект производного класса выбивает странную ошибку: Error 1 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int и вот такую Error 3 error C2523: 'Alive_prod::~Alive_product' : destructor tag mismatch Я не вижу в чем проблема... class...
C++ Определить, есть ли в последовательности одинаковые соседние числа http://www.cyberforum.ru/cpp-beginners/thread1072109.html
Ребята, помогите пожалуйста, срочно необходимо написать программу на с++. Условия такие: Даны натуральные числа A1, A2, A3, ... . Признак конца последовательности 0. Определить: есть ли в последовательности одинаковые соседние числа.
C++ Реализуйте и протестируйте функцию Реализуйте и протестируйте функцию: template <class T> void Rear2Head(Node<T> * &head); перемещающую последний элемент связного списка в его начало. заранее спасибо за комментарии) подробнее

Показать сообщение отдельно
striderghost
0 / 0 / 0
Регистрация: 15.01.2014
Сообщений: 2

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

15.01.2014, 15:23. Просмотров 311. Ответов 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();
 
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru