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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
#1

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

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

Здравствуйте, друзья.
Проверьте, пожалуйста, всё ли правильно написано (отсутствие сообщений об ошибках не исключает их присутствия).
Цель - создать класс с указателем типа 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2012, 23:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поле класса - динамический массив (C++):

Найти причины возникновения ошибок в коде и исправить эти ошибки (динамический массив как поле класса) - C++
когда запускаю, пишет что нет прав доступа для записи в память. если писать без класса, то все работает P.S. использую MVS Express 2015...

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

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

Динамический массив объектов класса - C++
Здравствуйте. Возник вопрос, на который не получается найти понятного ответа. Есть класс Point: #include &lt;iostream&gt; #include...

Динамический массив объектов класса - C++
Как вместо статически введённых 5 объектов использовать ввод переменной во время выполнения программы, которая будет иметь значение, а...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
31.12.2012, 01:13 #2
C++
1
2
3
4
5
DinArr :: DinArr(const DinArr& obj)
{
    array = obj.array;
    length = obj.length;
}
Это не правильно, и еще нехватает перегрузки оператора присвоения
1
Uvi
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
UserAK
73 / 73 / 4
Регистрация: 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
OdessaNA
19 / 19 / 0
Регистрация: 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
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
31.12.2012, 17:46 #6
А зачем length + 1 ?
0
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
31.12.2012, 20:43  [ТС] #7
Цитата Сообщение от Avazart Посмотреть сообщение
А зачем length + 1 ?
Т.к. в моём классе length - индекс элементов. Соответственно размер массива length+1 .
0
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
31.12.2012, 20:46 #8
Т.е. ? length обычно обозначают размер массива ?
Зачем выделять на один элемент больше ?
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
31.12.2012, 21:34 #9
OdessaNA, на каждый new должен приходиться delete. (new[] / delete[]). Вот и считайте.
1
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
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
OdessaNA
19 / 19 / 0
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.01.2013, 19:02 #12
Всё окей. (Чтоб всё точно было окей, стоит перенести инициализацию размеров после оператора new. Если new сломается, то у вас будет хотя бы пустой массив, а не чёрти что.)
1
MrCold
855 / 753 / 71
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.01.2013, 20:41 #14
Зачем? Это конструктор, 1) он вызывается один раз, 2) значение array не определено. А в operator=() delete[] есть.
2
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
01.01.2013, 20:45 #15
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Это конструктор, 1) он вызывается один раз
Точно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.01.2013, 20:45
Привет! Вот еще темы с ответами:

Динамический массив внутри класса - C++
Сейчас не за компьютером, пишу по памяти. //объявляю в классе GLubyte* tex; //в методе класса GLuint s = width * height * 3; ...

Динамический массив объектов класса в функции - C++
Здравствуйте! У меня данные хранятся в файле, и, чтобы их отсортировать, я решил извлекать их из файла и записывать в динамический...

Удалить динамический массив в деструкторе класса - C++
Здравствуйте, есть следующий код. Хочу удалить динамический массив в деструкторе, но не выходит, не видит массив. Если описываю массив в...

Динамический массив указателей на объекты класса - C++
Добрый вечер! Нужна помощь У меня имеется класс STROKA(вроде уже готовый,и все хорошо) Только вот никак не могу понять, как создать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.01.2013, 20:45
Ответ Создать тему
Опции темы

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