Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.74
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
#1

Деструктор для массива матриц... - C++

25.10.2009, 17:37. Просмотров 3747. Ответов 27
Метки нет (Все метки)

Помогите написать деструктор для массива матриц.. Деструктор для матрицы вроде бы вот так пишется:
C++
1
2
3
4
5
{
    for (int z = 0; z < _rows; ++z)
        delete[] _matrix[z];
    delete[] _matrix;
}
А вот для массива матриц я не знаю Была вот такая идея:
C++
1
2
3
4
{
    for (int i = 0; i < _masDimension; ++i)
    _arrayOfMatrix[i].~Matrix();
}
Но компилятор ужасно злится, а потом программа вылетает..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2009, 17:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Деструктор для массива матриц... (C++):

Деструктор для массива - C++
пишу шаблон класса: template &lt;class T&gt; class vector { T* array; public: int size;

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B - C++
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Написать процедуру для суммирования матриц. Ошибка при передаче массива в функцию - C++
Помогите пожалуйста! Дано задание: Написать процедуру для суммирования матриц. С ее помощью сложить исходную матрицу и...

Глючит деструктор динамическогом массива - C++
Деструктор: template &lt;typename TBase&gt; TArray &lt;TBase&gt;:: ~TArray ( ) { ...

Освобождение памяти динамического массива. Деструктор - C++
Почему выдает ошибку при написании деструктора? Если его убрать, то все работает. #pragma once #ifndef MATRIX_H #define...

Деструктор класса. Удаление динамически выделенного массива в классе - C++
First.h class First { private: int* num; int n; public: First(int a); ~First();

27
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 17:58 #2
Vladd, Для начала, покажи кто такой
Цитата Сообщение от Vladd Посмотреть сообщение
Matrix
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
25.10.2009, 18:38 #3
попробуй
так
C++
1
2
3
4
5
6
7
for (int i = 0; i < _masDimension; ++i)
{
    for (int z = 0; z < _rows; ++z)
        delete[] _matrix[z][i];
    delete[] _matrix[i];
}
delete[] _arrayOfMatrix;
0
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
26.10.2009, 19:42  [ТС] #4
Цитата Сообщение от M128K145 Посмотреть сообщение
попробуй
так
C++
1
2
3
4
5
6
7
for (int i = 0; i < _masDimension; ++i)
{
    for (int z = 0; z < _rows; ++z)
        delete[] _matrix[z][i];
    delete[] _matrix[i];
}
delete[] _arrayOfMatrix;
Попробовал, пишет что _matrix необъявленный идентификатор... Я подумал, что может у меня создание неправильно реализовано.. В общем вот код:

Matrix.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Matrix
{
private:
    int** _matrix;
    int _rows, _cols;
 
    void Create();
    void Filling();
 
public:
    Matrix();
    Matrix(int i);
    Matrix(int i, int j);
    Matrix(const Matrix&);
 
    ~Matrix();
};

Matrix.cpp
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
void Matrix::Create()
{
    _matrix = new int*[_rows];
    for (int z = 0; z < _rows; z++)
    _matrix[z] = new int[_cols];
}
 
void Matrix::Filling()
{
    srand(time(NULL));
    for (int i = 0; i < _rows; ++i)
    for (int j = 0; j < _cols; ++j)
        _matrix[i][j] = rand()%10;
}
 
Matrix::Matrix():_rows(5), _cols(5) { Create(), Filling(); }
 
Matrix::Matrix(int i): _rows(i), _cols(i) { Create(); Filling(); }
 
Matrix::Matrix(int rows, int cols): _rows(rows), _cols(cols) { Create(); Filling(); }
 
Matrix::Matrix(const Matrix& m)         
{
    _rows = m._rows;
    _cols = m._cols;
    Create();
    for (int i = 0; i < _rows; ++i)
        for (int j = 0; j < _cols; ++j)
            _matrix[i][j] = m._matrix[i][j];
}
 
Matrix::~Matrix()
{
    for (int z = 0; z < _rows; z++)
        delete[] _matrix[z];
    delete[] _matrix;
}

ArrayOfMatrix.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ArrayOfMatrix
{
    private:
    Matrix* _arrayOfMatrix;
    int _masDimension;
    int _rows, _cols;
    void Create ();
    Matrix Creator();
        
    public:
    ArrayOfMatrix(int, int, int);           // 1ое число: размер массива, 2ое и 3ье: размеры матрицы
 
    ~ArrayOfMatrix();
}

ArrayOfMatrix.cpp
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
void ArrayOfMatrix::Create()
{
    _arrayOfMatrix = new Matrix[_masDimension];
    for (int i = 0; i < _masDimension; ++i)
    _arrayOfMatrix[i] = Creator();
}
 
Matrix ArrayOfMatrix::Creator()
{
    Matrix obj;
    return obj;
}
 
ArrayOfMatrix::ArrayOfMatrix(int masDimension, int rows, int cols) 
{   
    _rows = rows;
    _cols = cols;
    _masDimension = masDimension;
    Create();
}
 
ArrayOfMatrix::~ArrayOfMatrix()
{
    for (int i = 0; i < _masDimension; ++i)
    {
        for (int z = 0; z < _rows; ++z)
        delete[] _matrix[z][i];
        delete[] _matrix[i];
    }
    delete[] _arrayOfMatrix;
}

Не спрашивайте почему я так модно создаю массив матриц Зато сам придумал
0
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
27.10.2009, 16:57  [ТС] #5
Скажите пож-та на что вообще указывает указатель массива матриц? На элемент [0][0]?
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
27.10.2009, 19:32 #6
Ели ты про поле _arrayOfMatrix, то на _arrayOfMatrix[0], которое ты выделил через new
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
27.10.2009, 23:12 #7
C++
1
2
3
4
5
6
7
ArrayOfMatrix::~ArrayOfMatrix()
{
    int i;
    for(i = 0; i < _masDimension; ++i)
        _arrayOfMatrix[i].~Matrix();
    delete[] _arrayOfMatrix;
}
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
27.10.2009, 23:21 #8
Конструктор и деструктор - это НЕ функции, а потому вызывать их нельзя
0
Даемоник
42 / 42 / 3
Регистрация: 22.05.2009
Сообщений: 97
27.10.2009, 23:33 #9
Цитата Сообщение от Vladd Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
ArrayOfMatrix::~ArrayOfMatrix()
{
 for (int i = 0; i < _masDimension; ++i)
 {
 for (int z = 0; z < _rows; ++z)
 delete[] _matrix[z][i];
 delete[] _matrix[i];
 }
 delete[] _arrayOfMatrix;
По-моему в этом куске надо поменять местами i и z(в строке delete[] _matrix[z][i]), потому что получается ты удаляешь из каждой строки элемент соответствующий значению i, а не z.
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
27.10.2009, 23:57 #10
Evg, я тоже слышал такое утверждение, но все же объясни тогда пожалуйста такое явление
код
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
#include <iostream>
class test
{
    int a;
    public:
    test();
    ~test();
};
test::test()
{
    a = 5;
    std::cout<<"создан\na = "<<a<<std::endl;
}
test::~test()
{
    a = NULL;
    std::cout<<"удален\na = "<<a<<std::endl;
}
int main()
{
    setlocale(LC_ALL, "Russian");
 
    test* ts1 = new test();
    delete ts1;
 
    test* ts2 = new test();
    ts2->~test();
 
    system("pause");
    return 0;
}

результат
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
28.10.2009, 00:10 #11
Я фигею... на gcc работает, на борланде работает.... Более того, на деструктор разрешается брать адрес (на конструктор - нет). Интересная штука, надо этот вопрос поизучать
0
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
28.10.2009, 06:47  [ТС] #12
Цитата Сообщение от M128K145 Посмотреть сообщение
C++
1
2
3
4
5
6
7
ArrayOfMatrix::~ArrayOfMatrix()
{
    int i;
    for(i = 0; i < _masDimension; ++i)
        _arrayOfMatrix[i].~Matrix();
    delete[] _arrayOfMatrix;
}
Выдаёт вот это и программа вылетает
Необработанное исключение типа "System.AccessViolationException" произошло в ArrayOfMatrix.exe
Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

Добавлено через 2 минуты
Цитата Сообщение от Даемоник Посмотреть сообщение
По-моему в этом куске надо поменять местами i и z(в строке delete[] _matrix[z][i]), потому что получается ты удаляешь из каждой строки элемент соответствующий значению i, а не z.
Пишет: error C2065: _matrix: необъявленный идентификатор
0
M128K145
Эксперт С++
8297 / 3517 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
28.10.2009, 07:40 #13
Vladd, скинь код мейна
0
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
28.10.2009, 08:39  [ТС] #14
Цитата Сообщение от M128K145 Посмотреть сообщение
Vladd, скинь код мейна
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include "ArrayOfMatrix.h"
#include "Matrix.h"
 
using namespace std;
 
void main()
{
    ArrayOfMatrix m1(3,5,5);
    cout << m1[1] << endl;
    getch();
}
Без деструктора всё нормально работает, но мне надо учителю доказать что здесь будет композиция, т.е. времена жизни объектов Матрикс и АррОфМатрикс одинаковы.. Вот я и парюсь с деструктором... Оператор << перегружен и выдаёт всё нормально..
C++
1
2
3
4
5
6
7
8
9
10
 std::ostream& operator<<(std::ostream& out, const Matrix& object )
 {
    for( int i=0; i<object._rows; ++i )
    {
        for( int j=0; j<object._cols; ++j )
            out << object._matrix[i][j] << " ";
        out << std::endl;
    }
    return out;
 }
Мне кажется что я коряво как-то создаю массив матриц...
C++
1
2
3
4
5
6
7
8
9
10
11
12
void ArrayOfMatrix::Create()
{
    _arrayOfMatrix = new Matrix[_masDimension];
    for (int i = 0; i < _masDimension; ++i)
        _arrayOfMatrix[i] = Creator();
}
 
Matrix ArrayOfMatrix::Creator()
{
    Matrix obj;
    return obj;
}
Может есть другой метод?
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
28.10.2009, 16:22 #15
С деструктораи ситуация следующая. В стандарте действительно их можно вызывать. При этом в момент удаления объекта он всё равно будет вызван

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream.h>
 
class T
{
  public:
    T() { cout << "constr\n"; }
    ~T() { cout << "destr\n"; }
};
 
int main (void)
{
  T t;
  t.~T();
}
Код
constr
destr
destr
В стандарте описывается единственный случай, когда это нужно делать - это если мы вызывали new с указанием места в памяти, где выделать объект. Ибо в этом случае получается, что нельзя вызывать delete на объект, поэтому оставили способ, чтобы вызвать деструктор. Во всех остальных случаях поведение неопределено. Поэтому в данном случае так вызывать деструктор нельзя

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream.h>
 
class T
{
    int x;
  public:
    T() { cout << "constr\n"; }
    ~T() { cout << "destr\n"; }
};
 
int main (void)
{
  char *buf = new char[sizeof(T)];
  T *t = new(buf) T;
  
  t->~T();
}
2
28.10.2009, 16:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2009, 16:22
Привет! Вот еще темы с ответами:

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

Деструктор для списков - C++
Ребята,как создать деструктор для списка в классе??? Подскажите-помагите пожалуйста!!Очень и срочно надо!!!!!

Деструктор для дерева - C++
Добрый вечер! Помогите, пожалуйста, написать деструктор для дерева. enum color { RED, BLACK }; // Звено дерева typedef struct...

конструктор и деструктор для cout - C++
Здарова! нужно решить задачу: есть код: int main() { cout &lt;&lt;&quot;Hellow world&quot;&lt;&lt;endl; } нужно без модифицирования...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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