Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
1

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

11.10.2018, 20:32. Показов 2712. Ответов 11

Здравствуйте, имеется класс представляющий собой понятие динамического массива. Нужно перегрузить операции добавления и удаления нового элемента в динамическом массиве.
Предположим, у меня есть 2 объекта класса, первый - массив из 5 элементов, второй - массив из одного элемента (число). Я хочу добавить второй объект(число) в конец массива, используя push_back из vector, как это можно реализовать? заранее спасибо.
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
//// ConsoleApplication110.cpp: определяет точку входа для консольного приложения.
////
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
 
 
class Array
{
private:
    int max;
    double  value;
    
    vector <double> mas;
    
public:
    
    void CreateMas(int n)
    {
        max = n;
        for (int i = 0; i < max; i++)
        {
            mas.push_back(i);
        }
    }
 
    void ShowMas()
    {
        for (int i = 0; i < mas.size(); i++) 
        {
            cout << mas[i] << ' '  ;
        }
    }
    void deleteArray(double* massiv) 
    {
        delete[] massiv;
    }
    
    Array operator+ (const Array& obj, const Array& obj2)
    {
        obj.mas = obj.mas.push_back(obj2);  // как переписать этот бред нормально?
        return obj.mas;
        
    }
};
 
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    Array a, b ;
 
    a.CreateMas(5);
    b.CreateMas(1);
    a.ShowMas();
    b.ShowMas();
    
 
    return 0;
}
Добавлено через 1 час 54 минуты
При запуске программы вылетает ошибка. Наверняка, что-то связанно с выделением памяти, помогите пофиксить, пожалуйста.
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
//// ConsoleApplication110.cpp: определяет точку входа для консольного приложения.
////
//
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
class Array
{
private:
    int max;
    double  value;
    
    double *mas;
    
public:
    
    void CreateMas(int n)
    {
        max = n;
        double *mas = new double[max];
        for (int i = 0; i < max; i++)
        {
            mas[i] = 0;
        }
    }
 
    void ShowMas()
    {
        for (int i = 0; i < max; i++) 
        {
            cout << mas[i] << ' '  ;
        }
    }
    void deleteArray(double* massiv) //Очистка памяти
    {
        delete[] massiv;
    }
    
    Array operator+ ( Array& obj)
    {
        Array temp;
        temp.mas = new double[max + 1];
        int k = 0;
        for (k = 0; k < max; k++)
        {
            temp.mas[k] = obj.mas[k];
        }
        
        temp.mas[k] = *obj.mas;
 
        return temp;
 
    }
 
 
 
    ~Array()
    {
        delete[]mas;
    }
 
    friend ostream& operator<<(ostream&, Array&);
};
/*ostream& operator<<(ostream& o, Array& x) {
    return o << x.ShowMas;
}
*/
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    Array a, b ,c  ;
    
    a.CreateMas(5);
    b.CreateMas(1);
    a.ShowMas();
    b.ShowMas();
    c = a + b;
    c.ShowMas();
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2018, 20:32
Ответы с готовыми решениями:

Реализовать приложение, содержащее функции добавления нового элемента в массив и удаления элемента из массива. (Имитируется “резиновый” массив)
Реализовать приложение, содержащее функции добавления нового элемента в массив и удаления элемента...

Функция для удаления элемента в двумерном динамическом массиве. В чем ошибка?
функция для удаления элемента в двум дин массиве (пока только часть в которой указывается какой...

Функции добавления, удаления данных в массиве.
Есть код в котором создается новый массив, помогите написать функции добавления, удаления и вывода...

Не рекурсивный метод добавления нового элемента n-ым в список
Ничего не работает. И вообще не уверен в правильности. Не понимаю, как вставлять, вместо чего. ...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
11
72 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
11.10.2018, 21:37 2
C++
1
2
3
4
    void CreateMas(int n)
    {
        max = n;
        double *mas = new double[max];
Тут вы запоминаете выделенную память в локальную переменную, а не в переменную класса.
0
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
11.10.2018, 21:39  [ТС] 3
mishelle92, с этим косяком уже разобрался, спасибо. Не подскажете, как дальше пофиксить ошибки с памятью?
0
72 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
11.10.2018, 21:43 4
Лучший ответ Сообщение было отмечено Yavorsky как решение

Решение

Цитата Сообщение от Yavorsky Посмотреть сообщение
C++
1
2
3
4
5
6
Array operator+ (const Array& obj, const Array& obj2)
{
    obj.mas = obj.mas.push_back(obj2);  // как переписать этот бред нормально?
    return obj.mas;
        
}
Если нужно добавление массива в другой, то что-то вроде этого:

C++
1
2
3
4
void append(const Array &other)
{
    mas.insert(mas.end(), other.mas.begin(), other.mas.end());
}
0
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
11.10.2018, 21:48  [ТС] 5
mishelle92, спасибо!
0
72 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
11.10.2018, 21:55 6
Yavorsky, определитесь что вам нужно (не знаю задача у вас какая-то или для себя пробуете). Можно ли применять vector или обязательно нужно использовать массив. Если для себя, то используйте массив как во втором варианте, для изучения будет полезней. Проблемы вашего варианта: неинициализированные переменные, отсутствие контроля владения массивом - не хватает копирующего конструктора и оператора присваивания. Функция CreateMas не нужна, используйте конструктор класса. Функция deleteArray вообще не понятно что делает. operator+ лучше оформлять как friend-функцию вне класса.
0
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
11.10.2018, 22:02  [ТС] 7
mishelle92, спасибо за замечания, учту, не совсем понял, для чего в данном случае нужен конструктор копирования и как он должен выглядеть(хотя бы примерно)?
0
72 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
11.10.2018, 22:14 8
Yavorsky, ваш класс Array по сути владеет массивом (который mas). Значит он выполняет удаление выделенной под этот массив памяти в своем деструкторе. Если не определите оператор присваивания и конструктор копирования, то в таком коде:

C++
1
2
Array a1 /*some initialization*/;
Array a2 = a1;
деструкторы двух объектов выполнят удаление одной и той же памяти дважды. А при модификации одного из этих объектов внезапно будет "меняться" и другой. Примерно так для копирующего конструктора:

C++
1
2
3
4
5
6
Array(const Array &other)
    : size(other.size)
{
    mas = new double[size];
    std::copy_n(other.mas, size, mas);
}
0
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
11.10.2018, 22:41  [ТС] 9
mishelle92, посмотрите, пожалуйста, правильно ли я написал оператором присваивания
C++
1
2
3
4
5
6
7
8
9
10
Array operator= (Array &obj)
    {
        
        max = obj.max;
        
        for (int i = 0; i<max; i++)
            mas[i] = obj.mas[i];
 
        return *this;
    }
при попытке использования вашего кода в моем классе в строке mas = new double[max]; выдает ошибку "отсутствует оператор = соответствующий этим операндам.
0
72 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
11.10.2018, 23:06 10
Цитата Сообщение от Yavorsky Посмотреть сообщение
C++
1
Array operator= (Array &obj)
1. Из этой функции нужно возвращать Array&.
2. Аргумент функции в ней не меняется, а значит может быть передан по константной ссылке:

C++
1
Array& operator= (const Array &obj)
3. Т.к. массивы могут быть разной длины, то скопировать из obj в текущий массив может не получится, если в obj массив большей длины.

Добавлено через 48 секунд
Цитата Сообщение от Yavorsky Посмотреть сообщение
при попытке использования вашего кода в моем классе в строке mas = new double[max]; выдает ошибку "отсутствует оператор = соответствующий этим операндам.
Какой тип у переменной mas? Я всё пишу, в предположении, что там double*.
0
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
11.10.2018, 23:08  [ТС] 11
mishelle92,
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
//// ConsoleApplication110.cpp: определяет точку входа для консольного приложения.
////
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
 
 
class Array
{
private:
    int max;
    double  value;
 
    vector <double> mas;
 
public:
 
     Array (int n)
    {
        max = n;
        for (int i = 0; i < max; i++)
        {
            mas.push_back(i+1);
        }
        
    }
     Array() { }
 
    void ShowMas()
    {
        for (int i = 0; i < mas.size(); i++)
        {
            cout << mas[i] << ' ';
        }
        cout << endl;
    }
    
    Array operator+ (const Array& obj)
    {
        mas.insert(mas.end(), obj.mas.begin(), obj.mas.end());
        return obj;
 
    }
    Array operator = (const Array &obj)
    {
        //delete[] &mas;
        max = obj.max;
 
        for (int i = 0; i<max; i++)
            mas[i] = obj.mas[i];
 
        return *this;
    }
    
     Array(const Array& obj)
    : max(obj.max)
    {
        mas = new double[max];
        copy_n(obj.mas, max, mas);
    }
    
 
};
 
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    Array a(3), b(5), c ;
 
    
    a.ShowMas();
    b.ShowMas();
    
    c = a + b;
    c.ShowMas();
 
    return 0;
}
Вот код полностью, что-то не получается даже с использованием const .
0
72 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
11.10.2018, 23:15 12
Цитата Сообщение от Yavorsky Посмотреть сообщение
vector <double> mas;
Я думал, что у вас там double *mas. С vector всё будет проще:

C++
1
2
3
Array(const Array& obj)
    : mas(obj.mas)
{ }
Выбирайте сами)

Добавлено через 1 минуту
С vector ваш класс получится реализовать очень просто. Поэтому если хотите подучиться - берите голый массив.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2018, 23:15

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Напишите функции для добавления/удаления элемента в стек
помогите написать пожалуйста программу, реализующую работу стека. Напишите функции для...

В чем ошибки в коде добавления и удаления элемента из очереди?
В идеале должно производиться добавление и удаление элемента из очереди...

Написать функции для добавления/удаления элемента в очередь
Помогите пожалуйста написать написать программу, реализующую работу очереди использую простые...

Циклическая очередь, сбой после удаления/добавления элемента
нарушается после того как удаляю элемент, и добавляю элемент снова Организуйте циклическую...

Массив: написать функцию удаления элемента из массива и возвращения нового массива без этого элемента
Помогите написать функцию удаления элемента из массива и возвращения нового массива без этого...

Ошибка при вызове функции добавления нового элемента в массив
Описывается класс Datchik. Затем в классе Lists объявляется массив объектов класса датчик и...


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

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

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