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

Передача двумерного динамического массива в конструктор

18.04.2019, 02:10. Показов 4365. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, задача.
Произвольный многоугольник в двумерном пространстве».
Данные класса: количество вершин, указатель на динамически размещаемый массив координат вершин прямоугольника.
Функции класса: определение, является ли многоугольник той или иной фигурой на плоскости, вычисление площади многоугольника.
Само все реализовано без проблем, работает, только вот не понятно ка быть с динамическим массивом. Нужно сравнивать два объекта, через метод класса, следовательно никуда не уйти от копирующего конструктора... Вот над ним я и думаю в конце своего кода(если он немного грязный не ругайтесь, выложил весь чисто если интересно кому, а так вся суть в конечных строках)
Передаю тот массив так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int n1, **m;
    cin >> n1;
    m = new int*[n1];
    for (int i = 0; i < n1; i++) {
        m[i] = new int[2];
    }
    for (int i = 0; i < n1; i++) {
        for (int j = 0; j < 2; j++) {
            //cin >> m[i][j];
            m[i][j] = rand() % 10;
        }
        cout << "[" << m[i][0] << ", " << m[i][1] << "]" << endl;
    }
То все вроде норм, только если работать с одним объектом? как быть с другими, если я так передаю адрес на массив, то как же работать с другими объектами, так они взаимосвязаны эти многоугольники и получается совсем бред, нельзя сравнить их данные(тоже как задание) потому что будут одинаковы, что тут можно сделать с конструкторами, и как пользоваться в данном случае копирующим, чтобы как то менять адрес и работать с разными данными?
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
class AngleForm {
public:
    int n;
    int **m;
    AngleForm(int n1, int **m1) {
        this->n = n1;
        this->m = m1;
    }
    AngleForm(AngleForm&obj) {
        this->n = obj.n;
    }
    float Square() {
        float res, sum1 = 0, sum2 = 0;
        for (int i = 0; i < this->n - 1; i++) {
            sum1 += this->m[i][0] * this->m[i + 1][1];
        }
        sum1 += this->m[this->n - 1][0] * this->m[0][1];
        for (int i = 0; i < this->n - 1; i++) {
            cout << "\t" << this->m[i][1] << " * " << this->m[i + 1][0] << endl;
            sum2 += this->m[i][1] * this->m[i + 1][0];
        }
        sum2 += this->m[n - 1][1] * this->m[0][0];
        res = abs(sum2 - sum1);
        return res / 2;
    }
    string isSquare() {
        if (this->n == 4) {
            int v[4][2], mult, modules[4];
            for (int i = 0; i < 3; i++) {
                v[i][0] = this->m[i][0] - this->m[i + 1][0];
                v[i][1] = this->m[i][1] - this->m[i + 1][1];
            }
            v[3][0] = this->m[3][0] - this->m[0][0];
            v[3][1] = this->m[3][1] - this->m[0][1];
            for (int i = 0; i < 4; i++) {
                modules[i] = sqrt(v[i][0] * v[i][0] + v[i][1] * v[i][1]);
            }
            if ((abs(v[0][0]) == abs(v[2][0]) && abs(v[0][1]) == abs(v[2][1])) || (abs(v[1][0]) == abs(v[3][0]) && abs(v[1][1]) == abs(v[3][1]))) {
                mult = (abs(v[0][0]) * abs(v[1][0]) + abs(v[0][1]) * abs(v[1][1]));
                if (modules[0] == modules[1]&& modules[2] == modules[3]&& modules[1]==modules[2] && mult == 0) return "Квадрат";
                else if(mult == 0) return "Четырехугольник - прямоугольник";
                else if(modules[0] == modules[1] && modules[2] == modules[3] && modules[1] == modules[2]){
                    return "Четырехугольник - ромб";
                }
                else return "Четырехугольник паралелограмм";
            }
            else {
                return "Чорти какая фигура! Но 4 вершины есть!";
            }
        }
        else {
            return "Задано не 4 вершины!";
        }
    }
    string compare(AngleForm&obj) {
 
    }
 
};
Добавлено через 7 минут
И как реализовать деструктор, потому что освобождая память мы удаляем массив вне класса и он исчезает и дальнейшие деструкторы работают некоректно

Добавлено через 46 секунд
И как реализовать деструктор, потому что освобождая память мы удаляем массив вне класса и он исчезает и дальнейшие деструкторы работают некоректно
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.04.2019, 02:10
Ответы с готовыми решениями:

Передача параметров в конструктор при создании динамического массива
Добрый день! Есть довольно тривиальный класс: class Array1d{ int* ptr_; public: Array1d(int n): ptr_(new...

Передача динамического двумерного массива в функцию
Я сделал вот так: void PrintMatrix(int** matrix, int&amp; n, int&amp; m) { for (int i = 0; i &lt; n; i++) { cout &lt;&lt; &quot;Row &quot;...

Передача динамического двумерного массива в процедуру
Написал вот такой код для одномерного динамического массива #include &lt;iostream&gt; #include &lt;clocale&gt; using...

13
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.04.2019, 02:11
Лучший ответ Сообщение было отмечено TymurG как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    AngleForm(const AngleForm& obj)
    {
        this->n = obj.n;
        this->m = new int*[n];
        for (int i{}; i < n; ++i)
        {
            this->m[i] = new int[n];
            for (int j{}; j < n; ++j)
                this->m[i][j] = obj.m[i][j];
        }
    }
    ~AngleForm()
    {
        for (int i{}; i < n; ++i)
            delete[] this->m[i];
        delete[] this->m;
    }
1
0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
18.04.2019, 02:12  [ТС]
а почему используете const?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.04.2019, 02:13
И еще по хорошему желательно реализовать передачу динамических ресурсов при копировании для временных экземпляров класса, во избежание многократного копирования этих ресурсов.
0
0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
18.04.2019, 02:14  [ТС]
zayats80888, Разве адрес не будет одинаков?
И правильно ли написан мой конструктор с параметрами?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.04.2019, 02:17
Цитата Сообщение от TymurG Посмотреть сообщение
а почему используете const?
что бы была возможность инициализации автоматическими объектами

Добавлено через 59 секунд
Цитата Сообщение от TymurG Посмотреть сообщение
Разве адрес не будет одинаков?
Адрес чего?

Добавлено через 1 минуту
Цитата Сообщение от TymurG Посмотреть сообщение
И правильно ли написан мой конструктор с параметрами?
Если вы про
Цитата Сообщение от TymurG Посмотреть сообщение
AngleForm(int n1, int **m1)
, то лучше так не делать во избежание ошибок
0
0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
18.04.2019, 02:19  [ТС]
zayats80888, адрес внешнего массива, который передается в конструктор, не удаляется при выполнении деструктора? мы же переносим его экземплярам
И все же конструктор с параметрами правильно реализован у меня?
AngleForm(int n1, int **m1) {
this->n = n1;
this->m = m1;
}

Добавлено через 22 секунды
zayats80888, а как будет верно?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.04.2019, 02:19
C++
1
2
3
4
5
6
7
8
    AngleForm() : n(0), m(nullptr) {}//конструктор по умолчанию
 
    explicit AngleForm(int n1) : n(n1)
    {
        this->m = new int*[n];
        for (int i{}; i < n; ++i)
            this->m[i] = new int[n]{};
    }
0
0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
18.04.2019, 02:20  [ТС]
zayats80888, а что это за реализация? первый раз вижу...
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.04.2019, 02:20
Цитата Сообщение от TymurG Посмотреть сообщение
int n;
int** m;
это в private спрячьте
0
0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
18.04.2019, 02:22  [ТС]
zayats80888, это знаю, открыл для проверки во время выполнения
можно ли переписать этот конструктор на простой вид?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.04.2019, 02:28
Цитата Сообщение от TymurG Посмотреть сообщение
можно ли переписать этот конструктор на простой вид?
Куда уж проще?

Добавлено через 2 минуты
TymurG, в посте №8 два конструктора - по умолчанию и с одним параметром
0
0 / 0 / 0
Регистрация: 10.12.2018
Сообщений: 27
18.04.2019, 02:29  [ТС]
zayats80888, да увидел правки, не понял что первая строка конструктор основной неявный, но как сделать конструктор чтобы "обязательно включить в класс конструктор, использующий в качестве одного из параметров одномерный или двумерный массив чисел" - по заданию
только и не понятно обычный массив чисел и уже динамический
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.04.2019, 02:32
C++
1
2
3
4
5
6
7
8
9
10
11
    template<int size>
    AngleForm(int(&arr)[size][size]) : n(size)
    {
        this->m = new int*[n];
        for (int i{}; i < n; ++i)
        {
            this->m[i] = new int[n];
            for (int j{}; j < n; ++j)
                this->m[i][j] = arr[i][j];
        }
    }
пример инициализации
C++
1
2
3
    const int n = 5;
    int arr[n][n]{};
    AngleForm obj(arr);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2019, 02:32
Помогаю со студенческими работами здесь

Передача двумерного динамического массива в функцию
Как можно передать динамическую матрицу в функцию что бы при выходе из функции она оставила прежние значения?

Передача двумерного массива в конструктор класса
Здравствуйте! Не получается передать двумерный массив как параметр конструктора. Необходимо, чтобы пользователь ввел размерность...

Передача по ссылке двумерного динамического массива в функцию
Приведите, пожалуйста, пример. Нигде не могу найти.

Передача двумерного динамического массива чисел в функцию
void Map::setCell(int** block, Room* room, int type){ for(int i=room-&gt;x; i&lt;room-&gt;w; ++i) for(int j=room-&gt;y; j&lt;room-&gt;h; ++j) ...

Передача динамического двумерного массива через параметры
в такой вот простенькой программке: #include .. const n = 4; void ENTR(double pMas, char *file) { ifstream SMas(file); ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru