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

Реализация конструктора копирования для двумерного динамического массива

04.12.2019, 02:44. Показов 11182. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Практически реализовал, не понимаю, почему не получается...


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
#include <iostream>
#include <time.h>
using namespace std;
 
class matrix //Создание класса
{
public:
    int rows;
    int colums;
 
 
public:
    matrix(int rows, int colums)//Конструктор класса
    {
        this->ROWS = rows;
        this->COLUMS = colums;
        int** arr = new int* [rows]; //Создание массива указателей
 
        for (int i = 0; i < rows; i++) //Создание массива, хранящего указатели на остальные массивы
        {
            arr[i] = new int[colums];
        }
 
        for (int i = 0; i < rows; i++) //Генерация значений для двумерного динамического массива(матрицы)
        {
            for (int j = 0; j < colums; j++)
            {
                arr[i][j] = rand() % 10;
            }
        }
 
        for (int i = 0; i < rows; i++) //Вывод на экран сгенерированных значений двумерного динамичекого массива(матрицы)
        {
            for (int j = 0; j < colums; j++)
            {
                cout << arr[i][j] << "\t";
            }
            cout << endl;
        }
 
        for (int i = 0; i < rows; i++)
        {
            delete[] arr[i]; //Очистка памяти для каждого указателя, который хранит массив
        }
        delete[] arr; //Очистка данных основного массива
        cout << "Вызвался конструктор\t" << this << endl;
    }
 
    matrix(const matrix& other)
    {
        /*this->ROWS = other.ROWS;
        this->COLUMS = other.COLUMS;
        
        for (int i = 0; i < other.ROWS; i++)
        {
            this->arr[i] = new int[other.COLUMS];
        }*/
 
        cout << "Вызвался конструктор копирования\t" << this << endl;
    }
 
    ~matrix() // Деструктор
    {
        cout << "Вызвался деструктор\t" << this << endl;
    }
private:
    int ROWS;
    int COLUMS;
};
 
int main()
{
    setlocale(LC_ALL, "");
    srand((unsigned)time(NULL));
    int a = rand() % 10;
    int b = rand() % 10;
    matrix dinamic_matrix(a, b); //Создание объекта класса с размерностью по умолчанию
    matrix dinamic_matrix2(dinamic_matrix);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2019, 02:44
Ответы с готовыми решениями:

Реализация конструктора копирования для класса
P.S плохо с русским Этот конструктор копирования сломал мне мозг И вот что я понемаю когда мы делаем так foo objCopy(obj); ...

Реализация конструктора копирования
Как в С++/Сli написать конструктор копирования? Пересмотрел кучу материалов везде только под С++

Реализация конструктора копирования и перегрузки =
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class Cow{ private: char name; char *...

15
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.12.2019, 07:55
Цитата Сообщение от Mazytta56 Посмотреть сообщение
Реализация конструктора копирования для двумерного динамического массива
примерно так:
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
#include <cstddef>
#include <new>
 
class Matrix
{
private:
    std::size_t column = 0;
    std::size_t row = 0;
 
    int** matrix = nullptr;
 
    void Clear() noexcept
    {
        for (std::size_t i = 0; i < column; ++i)
        {
            delete[] matrix[i];
        }
 
        delete[] matrix;
    }
 
public:
    Matrix() {}
 
    Matrix(std::size_t c, std::size_t r):
        column{c}, row{r}, matrix{new int*[column] }
    {
        try
        {
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row] {0};
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
    }
 
    Matrix(const Matrix& m)
    {
        column = m.column;
        row = m.row;
 
        try
        {
            matrix = new int*[column];
 
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row];
            }
 
            for (std::size_t i = 0; i < column; ++i)
            {
                for (std::size_t j = 0; j < row; ++j)
                {
                    matrix[i][j] = m.matrix[i][j];
                }
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
    }
 
    ~Matrix()
    {
        Clear();
    }
};
 
int main()
{
    Matrix m {2, 2};
    Matrix n = m;
 
    return 0;
}
добавь логирование в код и удачно разобраться, если найдешь ошибки сообщи.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.12.2019, 10:46
Цитата Сообщение от _stanislav Посмотреть сообщение
catch(std::bad_alloc&)
Это здесь не нужно. В случае исключения вызовется деструктор, который, в свою очеред вызовет Clear().
Но, для корректной обработки исключения, нужно перед выделением массивов под строки заполнить matrix нулями, иначе Clear отработает с ошибкой. Что-то типа
C++
1
2
3
4
5
6
7
8
Matrix(std::size_t c, std::size_t r):
    column{c}, row{r}, matrix{new int*[column]}
{
 
    std::fill_n(matrix, column, nullptr);
    for (std::size_t i = 0; i < column; ++i)
        matrix[i] = new int[row] {0};
}
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.12.2019, 11:00
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это здесь не нужно. В случае исключения вызовется деструктор, который, в свою очеред вызовет Clear().
деструктор для недоделанного объекта не вызывается.
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Но, для корректной обработки исключения, нужно перед выделением массивов под строки заполнить matrix нулями, иначе Clear отработает с ошибкой.
в дебагере в студии тестил ошибок не было:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Matrix(std::size_t c, std::size_t r):
        column{c}, row{r}, matrix{new int*[column] }
    {
        try
        {
            throw std::bad_alloc{};
 
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row] {0};
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
    }
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.12.2019, 11:03
Цитата Сообщение от _stanislav Посмотреть сообщение
деструктор для недоделанного объекта не вызывается.
Действительно не вызывается. Я почему-то был уверен, что он не вызовется только если исключение произойдёт в списке инициализации.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.12.2019, 11:07
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
std::fill_n(matrix, column, nullptr);
сейчас проверил еще раз, отладчик кинул ошибку при чтении, точно нужно нулями заполнить.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.12.2019, 11:07
Цитата Сообщение от _stanislav Посмотреть сообщение
в дебагере в студии тестил ошибок не было:
Тебе повезло. А у меня были - там массив заполнен мусором.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.12.2019, 11:11
oleg-m1973, поправил:
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
#include <cstddef>
#include <new>
 
class Matrix
{
private:
    std::size_t column = 0;
    std::size_t row = 0;
 
    int** matrix = nullptr;
 
    void Clear() noexcept
    {
        for (std::size_t i = 0; i < column; ++i)
        {
            delete[] matrix[i];
        }
 
        delete[] matrix;
    }
 
public:
    Matrix() {}
 
    Matrix(std::size_t c, std::size_t r):
        column{c}, row{r}, matrix{new int*[column] {nullptr} }
    {
        try
        {
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row] {0};
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
    }
 
    Matrix(const Matrix& m)
    {
        column = m.column;
        row = m.row;
 
        try
        {
            matrix = new int*[column] {nullptr};
 
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row];
            }
 
            for (std::size_t i = 0; i < column; ++i)
            {
                for (std::size_t j = 0; j < row; ++j)
                {
                    matrix[i][j] = m.matrix[i][j];
                }
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
    }
 
    ~Matrix()
    {
        Clear();
    }
};
 
int main()
{
    Matrix m {2, 2};
    Matrix n = m;
 
    return 0;
}
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
04.12.2019, 13:29
_stanislav,

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
    Matrix(const Matrix& m)
        : column(m.column), row(m.row)
        , matrix(new int*[column] {nullptr})
    {
        try
        {
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row];
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
        for (std::size_t i = 0; i < column; ++i)
        {
            for (std::size_t j = 0; j < row; ++j)
            {
                matrix[i][j] = m.matrix[i][j];
            }
        }
    }
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.12.2019, 13:35
DrOffset, однако странно, что я не воспользовался списками инициализации в конструкторе копирования , поправка же на это?
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
04.12.2019, 13:36
Цитата Сообщение от _stanislav Посмотреть сообщение
(поправка же на это?)
Нет ) Я бы не стал к такой мелочи придираться.

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
        column = m.column; // Например, 12
        row = m.row; // например 2
 
        try
        {
            matrix = new int*[column] {nullptr}; // исключение, matrix остался nullptr
 
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row];
            }
 
            for (std::size_t i = 0; i < column; ++i)
            {
                for (std::size_t j = 0; j < row; ++j)
                {
                    matrix[i][j] = m.matrix[i][j];
                }
            }
        }
        catch(std::bad_alloc&)
        {
            Clear(); // попали сюда
            throw;
        }
 
................................
 
 
        for (std::size_t i = 0; i < column; ++i) // помним, что column - 12
        {
            delete[] matrix[i]; // разыменование нулевого указателя
        }
 
        delete[] matrix;
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.12.2019, 14:06
DrOffset, недосмотрел, точно знал что списки инит. это хорошо, теперь подкрепил знания.

Добавлено через 26 минут
Цитата Сообщение от _stanislav Посмотреть сообщение
точно знал что списки инит. это хорошо, теперь подкрепил знания.
DrOffset, хотя поправка была в том что не нужно было первый new писать в блоке try
но списки все равно гуд
0
0 / 0 / 0
Регистрация: 12.05.2016
Сообщений: 238
04.12.2019, 16:28  [ТС]
Спасибо за помощь!
0
0 / 0 / 0
Регистрация: 12.05.2016
Сообщений: 238
04.12.2019, 23:36  [ТС]
Коллеги, ваш код не моего уровня) Можете глянуть на мою реализацию, а конкретно то, что я закомментировал, что там не хватает? Мой код читаем?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.12.2019, 23:45
Цитата Сообщение от Mazytta56 Посмотреть сообщение
Коллеги, ваш код не моего уровня) Можете глянуть на мою реализацию, а конкретно то, что я закомментировал, что там не хватает? Мой код читаем?
Там вообще какая-то фигня. Сделай как во втором сообщении и всё.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.12.2019, 00:01
Mazytta56, вот норм твой код:
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
#include <cstddef>
#include <new>
 
class Matrix
{
private:
    std::size_t column = 0;
    std::size_t row = 0;
 
    int** matrix = nullptr;
 
    void Clear() noexcept
    {
        for (std::size_t i = 0; i < column; ++i)
        {
            delete[] matrix[i];
        }
 
        delete[] matrix;
    }
 
public:
    Matrix() {}
 
    Matrix(std::size_t c, std::size_t r):
        column{c}, row{r}, matrix{new int*[column] {nullptr} }
    {
        try
        {
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row] {0};
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
    }
 
     Matrix(const Matrix& m)
        : column(m.column), row(m.row)
        , matrix(new int*[column] {nullptr})
    {
        try
        {
            for (std::size_t i = 0; i < column; ++i)
            {
                matrix[i] = new int[row];
            }
        }
        catch(std::bad_alloc&)
        {
            Clear();
            throw;
        }
        for (std::size_t i = 0; i < column; ++i)
        {
            for (std::size_t j = 0; j < row; ++j)
            {
                matrix[i][j] = m.matrix[i][j];
            }
        }
    }
 
    ~Matrix()
    {
        Clear();
    }
};
 
int main()
{
    Matrix m {2, 2};
    Matrix n = m;
 
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2019, 00:01
Помогаю со студенческими работами здесь

Класс для двумерного динамического массива
Вот написал код для двумерного динамического массива с перегруженым оператором= и +. Собственно код работает в MS VS 2010, но меня...

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

Метод для изменения значений двумерного динамического массива
Здравствуйте, на курсах задали такое задание: &quot;Создайте метод, который для двумерного динамического массива(инициализация которого должна...

Вновь итератор. реализация для динамического массива
Реализовываю по заданию контейнер-шаблон растущий массив. В принципе, ничего сложно и непонятного, кроме одной вещи(для меня:)): ...

Выделение памяти для динамического двумерного массива внутри функции
Имеется вот такой код : #include &lt;iostream&gt; void allocateMemory(int ***array, int size); void freeMemory(int **array, int size); ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru