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

заполнение класса в цикле - C++

Восстановить пароль Регистрация
 
Alexanches
86 / 7 / 1
Регистрация: 04.06.2010
Сообщений: 80
19.09.2011, 00:23     заполнение класса в цикле #1
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
цикл:
int _tmain(int argc, _TCHAR* argv[])
{
    int d,m,y;
    ZapBook* z=new ZapBook[1000];
    int length=0;
    char flag='y';
    while(flag=='y')
    {
        cout<<"Vedite Familiyu"<<"\n";
        char buf[128];
        scanf("%255s",buf);
        cout<<"Vedite Imya"<<"\n";
        char buf1[128];
        scanf("%255s",buf1);
        cout<<"Vedite Otchestvo"<<"\n";
        char buf2[128];
        scanf("%255s",buf2);
        cout<<"Vedite Telephone"<<"\n";
        long int t;
        cin>>t;
        cout<<"\nVedite day ";
        cin>>d;
        cout<<"\nVedite month ";
        cin>>m;
        cout<<"\nVedite year ";
        cin>>y;
        ZapBook tmp=ZapBook(buf,buf1,buf2,t,d,m,y);
        z[length].copy(tmp);
        length++;
        
        cout<<"dlya vvoda nazhmite y";
        cin>>flag;
    }
 
 
конструктор:
    ZapBook(char* sn,char*n,char* s,long int tel,int d,int m,int y)
    {
        surname=new char[strlen(sn)+1];
        name=new char[strlen(n)+1];
        sname=new char[strlen(s)+1];
        strcpy(surname,sn);
        strcpy(name,n);
        strcpy(sname,s);
        surname[strlen(sn)]=name[strlen(n)]=sname[strlen(s)]='\0';
        telephone=tel;
        day=d;month=m;year=y;
    }
функция копирования:
    void copy(ZapBook b)
    {
 
        delete[]sname;
        delete[]name;
        delete[]surname;
        surname=new char[strlen(b.surname)+1];
        name=new char[strlen(b.name)+1];
        sname=new char[strlen(b.sname)+1];
        strcpy(surname,b.surname);
        strcpy(name,b.name);
        strcpy(sname,b.sname);
        surname[strlen(b.surname)]=name[strlen(b.name)]=sname[strlen(b.sname)]='\0';
        telephone=b.telephone;
        day=b.day;
        month=b.month;
        year=b.year;
    }
заполняю массив классов в цикле, естественно после этого вызывается деструктор и все это дело убивает...подскажите,как возможно этого избежать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2011, 00:23     заполнение класса в цикле
Посмотрите здесь:

внук родительского класса не может работать с полями дедовского класса; почему? C++
Как получить private переменную класса, функцей членом другого класса C++
Заполнение массива случайными числами в цикле C++
Как обраиться к функции класса через другую функцию класса (друга)? C++
Заполнение map объектами класса C++
Заполнение статического поля класса с клавиатуры C++
Заполнение класса C++
Шаблон класса, параметром которого должны являться наследники определённого класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
19.09.2011, 03:30     заполнение класса в цикле #2
Строку 28 лучше бы записать так:
C++
1
ZapBook tmp(buf,buf1,buf2,t,d,m,y);
А вообще, для этого класса обязательно надо определить конструктор копирования и оператор присваивания (отдельная функция копирования, в общем-то, не нужна).
Кроме того, в программе определённо используется и конструктор по умолчанию (без параметров), но его определения не видно.
Ну а возвращаясь к вопросу, объекты массива z в показанном участке кода вообще не удаляются и, соответственно, деструкторы для них не вызываются. Вызываются деструкторы для объектов tmp. А вот если в строке 28 создаётся ещё и временный объект (тут я не уверен, там ведь инициализация), то при неопределённом конструкторе копирования память будет удаляться дважды, а в массив тогда будут копироваться удалённые уже строки.
Alexanches
86 / 7 / 1
Регистрация: 04.06.2010
Сообщений: 80
19.09.2011, 07:05  [ТС]     заполнение класса в цикле #3
присваивание:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ZapBook & operator=(const ZapBook& b)
    {
                delete[]sname;
        delete[]name;
        delete[]surname;
        surname=new char[strlen(b.surname)+1];
        name=new char[strlen(b.name)+1];
        sname=new char[strlen(b.sname)+1];
        strcpy(surname,b.surname);
        strcpy(name,b.name);
        strcpy(sname,b.sname);
        surname[strlen(b.surname)]=name[strlen(b.name)]=sname[strlen(b.sname)]='\0';
        telephone=b.telephone;
        day=b.day;
        month=b.month;
        year=b.year;
        return *this;
 
    }
конструктор копирования:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ZapBook(const ZapBook & b)
    {
        surname=new char[strlen(b.surname)+1];
        name=new char[strlen(b.name)+1];
        sname=new char[strlen(b.sname)+1];
        strcpy(surname,b.surname);
        strcpy(name,b.name);
        strcpy(sname,b.sname);
        surname[strlen(b.surname)]=name[strlen(b.name)]=sname[strlen(b.sname)]='\0';
        telephone=b.telephone;
        day=b.day;
        month=b.month;
        year=b.year;
    }
все равно вызывается деструктор после окончания цикла..
Yandex
Объявления
19.09.2011, 07:05     заполнение класса в цикле
Ответ Создать тему
Опции темы

Текущее время: 01:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru