Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/58: Рейтинг темы: голосов - 58, средняя оценка - 4.97
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
1

Поле класса - динамический массив

30.12.2012, 23:37. Показов 10578. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, друзья.
Проверьте, пожалуйста, всё ли правильно написано (отсутствие сообщений об ошибках не исключает их присутствия).
Цель - создать класс с указателем типа int. Этот поле использовать как динамический массив.
Вот код:
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
#include <iostream>
#include <conio.h>
using namespace std;
 
const int SIZE = 3;
 
class DinArr
{
    int *array;
    int length;
public:
    DinArr() { array = new int [SIZE]; length = 0; }
    DinArr(const DinArr&);
    ~DinArr () { delete [] array; }
    void Verific( int );
    void Add( int );
    void Show();
 
};
DinArr :: DinArr(const DinArr& obj)
{
    array = obj.array;
    length = obj.length;
}
 
void DinArr :: Verific( int x )
{
    if( x >= SIZE)
    {
         int *temp = new int [x + 1];
         for(int i = 0; i < x; ++i)
         {
             temp[i] = array[i];
         }
         array = temp;
    }
}
 
void DinArr :: Add( int x )
{
    Verific( length );
    
    array[length++] = x;
}
 
void DinArr :: Show()
{
    for(int i = 0; i < length; ++i)
    {
        cout << array[i] << ' ';
    }
    cout << endl;
}
 
void main()
{
    DinArr obj;
 
    int z=0;
 
    while(z < 5)
    {
        obj.Add(7);
        z++;
    }
 
    obj.Show();
 
    _getch();
}
Интересует вопрос - очищается ли вся выделенная память?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2012, 23:37
Ответы с готовыми решениями:

Найти причины возникновения ошибок в коде и исправить эти ошибки (динамический массив как поле класса)
когда запускаю, пишет что нет прав доступа для записи в память. если писать без класса, то все...

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

Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив...

16
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2012, 01:13 2
C++
1
2
3
4
5
DinArr :: DinArr(const DinArr& obj)
{
    array = obj.array;
    length = obj.length;
}
Это не правильно, и еще нехватает перегрузки оператора присвоения
1
1 / 1 / 0
Регистрация: 22.05.2012
Сообщений: 18
31.12.2012, 04:22 3
C++
1
2
3
4
5
6
7
8
9
DinArr :: DinArr(const DinArr& obj)
{
    this->arr=new int[obj.length];
    for(int i=0;i<obj.length;i++)
    {
        arr[i]=obj.arr[i];
    }
    this->length=obj.length;
}
во первых нужно выделить память для твоего поинтера, а потом делать глубокое копирование .
То что ты сделал, если выделить память, тоже будет работать. Я тоже студент, далеко не специалист. Нас учили, что правильнее переписывать глубоко все переменные. С интеджерами это работает, но есле у тебя кроме них еще куча всего будет внутри, то не факт.
кроме этого вместо array нужно поставить другое название, например arr (как я поставил) в копи констракторе,
array - это уже готовый массив в библиотеке.
1
73 / 73 / 13
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
31.12.2012, 05:57 4
если есть new, то должен быть и delete
например
C++
1
int *temp = new int [x + 1];
...
надо бы сначала
C++
1
delete[] array;
а уж потом
C++
1
array = temp;
Добавлено через 8 минут
чтоб было веселее можно вместо void DinArr::Show() перегрузить оператор <<

Добавлено через 6 минут
Цитата Сообщение от Uvi Посмотреть сообщение
array - это уже готовый массив в библиотеке.
впринципе это не особо страшно, просто придётся указывать пространство имён, но конечно для удобства лучше избегать таких ситуаций.
многие используют в именах переменных членов класса приставку m_
получится m_array

Добавлено через 13 минут
Цитата Сообщение от Uvi Посмотреть сообщение
правильнее переписывать глубоко все переменные
почти у всех классов имеются закрытые члены, и поэтому в особых случаях надо использовать специальные функции вроде assign.
а структуры и так прекрасно копируются. вообще за правильное копирование отвечает разработчик класса.

Добавлено через 9 минут
Цитата Сообщение от OdessaNA Посмотреть сообщение
DinArr() { array = new int [SIZE]; length = 0; }
получается размер массива и length разные
2
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
31.12.2012, 17:41  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
DinArr :: DinArr(const DinArr& obj)
{
    array = obj.array;
    length = obj.length;
}
Это не правильно, и еще нехватает перегрузки оператора присвоения
Ёлку установил, можно и исправить:

C++
1
2
3
4
5
6
7
8
9
10
DinArr :: DinArr(const DinArr& obj)
{
    length = obj.length;
 
    array = new int [length + 1];
    for (int i = 0; i < length; i++)
    {
        array[i] = obj.array[i];
    }
}
... перегрузка будет "между" салатами и отбивными.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2012, 17:46 6
А зачем length + 1 ?
0
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
31.12.2012, 20:43  [ТС] 7
Цитата Сообщение от Avazart Посмотреть сообщение
А зачем length + 1 ?
Т.к. в моём классе length - индекс элементов. Соответственно размер массива length+1 .
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2012, 20:46 8
Т.е. ? length обычно обозначают размер массива ?
Зачем выделять на один элемент больше ?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
31.12.2012, 21:34 9
OdessaNA, на каждый new должен приходиться delete. (new[] / delete[]). Вот и считайте.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2012, 21:36 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
void DinArr :: Verific( int x )
{
    if( x >= SIZE)
    {
         int *temp = new int [x + 1];
         for(int i = 0; i < x; ++i)
         {
             temp[i] = array[i];
         }
         array = temp;
    }
}
Эту ф-цию надо переписать с учетом того что сказал go
0
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
01.01.2013, 18:47  [ТС] 11


Добавлено через 9 минут
Спасибо, друзья, за помощь!
Учел Ваши подсказки и замечания, и переписал код:
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
#include <iostream>
#include <conio.h>
using namespace std;
 
class DinArr
{
    int *array;
    int size;
public:
    DinArr();
    ~DinArr() { delete [] array; }
    DinArr(const DinArr&); //
    DinArr operator = (const DinArr&); //
    DinArr& operator ++ (); //
    DinArr& operator -- (); //
    void Add( int );
    void Show();
};
 
DinArr :: DinArr()
{
    size = 0;
    array = new int [size + 1];
}
 
DinArr :: DinArr(const DinArr& obj)
{
    size = obj.size;
 
    array = new int [size];
    for(int i = 0; i < size; ++i)
        array[i] = obj.array[i];
}
 
DinArr DinArr :: operator = (const DinArr& obj)
{
    size = obj.size;
 
    delete [] array;
 
    array = new int [size];
    for(int i = 0; i < size; ++i)
        array[i] = obj.array[i];
 
    return *this;
}
 
DinArr& DinArr :: operator ++ ()
{
 
    int *temp = new int[size + 1];
    for(int i = 0; i < size; ++i)
        temp[i] = array[i];
 
    delete [] array;
    array = temp;
 
    ++size;
    array[size-1] = 0;
 
    return *this;
}
 
DinArr& DinArr :: operator -- ()
{
    --size;
 
    int *temp = new int [size];
    for(int i = 0; i < size; ++i)
        temp[i] = array[i];
 
    delete [] array;
    array = temp;
 
    return *this;
}
 
void DinArr :: Add( int x )
{
        int *temp = new int [size + 1];
        for(int i = 0; i < size; ++i)
            temp[i] = array[i];
        
        delete [] array;
        array = temp;
 
        array[size] = x;
        ++size;
}
 
void DinArr :: Show()
{
    for(int i = 0; i < size; ++i)
        cout << array[i] << ' ';
    cout << endl;
}
 
void main()
{
    DinArr obj, obj2;
    
    int i = 0;
 
    while(i < 10)
        obj.Add(++i);
 
    obj.Show();
 
    obj2 = obj;
    ++obj2;
    --obj2;
 
    obj2.Show();
    
    _getch();
}
У меня остались некоторые сомнения по конструктору копирования. Подскажите, пожалуйста, он правильно реализован, или в нём есть ошибка?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.01.2013, 19:02 12
Всё окей. (Чтоб всё точно было окей, стоит перенести инициализацию размеров после оператора new. Если new сломается, то у вас будет хотя бы пустой массив, а не чёрти что.)
1
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
01.01.2013, 19:58 13
Цитата Сообщение от OdessaNA Посмотреть сообщение
сомнения по конструктору копирования
delete пропустили , без него будет утечка памяти
C++
1
2
3
4
5
6
7
8
9
DinArr :: DinArr(const DinArr& obj)
{   
       delete [] array;
 
    array = new int [obj.size];
      size = obj.size;
    for(int i = 0; i < size; ++i)
        array[i] = obj.array[i];
}
1
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.01.2013, 20:41 14
Зачем? Это конструктор, 1) он вызывается один раз, 2) значение array не определено. А в operator=() delete[] есть.
2
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
01.01.2013, 20:45 15
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Это конструктор, 1) он вызывается один раз
Точно
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
01.01.2013, 21:13 16
Цитата Сообщение от OdessaNA Посмотреть сообщение
void Show();
Должна быть const.
Цитата Сообщение от OdessaNA Посмотреть сообщение
DinArr :: DinArr()
{
* * size = 0;
* * array = new int [size + 1];
}
Непонятен этот size + 1. Почему не NULL?
Цитата Сообщение от OdessaNA Посмотреть сообщение
DinArr DinArr :: operator = (const DinArr& obj)
{
* * size = obj.size;
delete [] array;
array = new int [size];
* * for(int i = 0; i < size; ++i)
* * * * array[i] = obj.array[i];
return *this;
}
Желательно возвращать ссылку(по аналогии со встроенными типами). И где проверка на присваивание объекту его собственной копии?
P.S. Касательно
C++
1
2
delete [] array;
array = new int [size];
При возникновении исключения в случае ошибки выделения памяти, после выполнения delete [] array, array так и останется "неинициализированным" указателем. При этом, во время обработки исключения декструктор данного(уже сконструированного) объекта всеравно будет вызван. Для того чтобы избежать повторного вызова delete [] array в деструкторе, после освобождения памяти данный указатель следует обнулить.
1
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
01.01.2013, 21:41  [ТС] 17
rangerx, ~OhMyGodSoLong~, спасибо за поправки!

Добавлено через 15 минут
Внес изменения с учетом Ваших замечаний. Теперь "читабельнее".
Ещё раз спасибо!
0
01.01.2013, 21:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.01.2013, 21:41
Помогаю со студенческими работами здесь

Динамический массив класса
Как добавить в массив класса новый элемент? С моим вариантом из компилятора не выбрасывает но и не...

Динамический массив класса
помогите пожалуйста,суть задачи:создать ксласс с конструктором и деструктором,в конструкторе...

Динамический массив внутри класса
Сейчас не за компьютером, пишу по памяти. //объявляю в классе GLubyte* tex; //в методе...

Динамический массив абстрактного класса
Никак не могу понять, почему память не освобождается. Подскажите в чем ошибка пожалуйста. #ifndef...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru