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

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

Войти
Регистрация
Восстановить пароль
 
Alexanches
86 / 7 / 1
Регистрация: 04.06.2010
Сообщений: 80
#1

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

19.09.2011, 00:23. Просмотров 631. Ответов 2
Метки нет (Все метки)

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++
Попробовал так (для освоения материала) #include &lt;vcl.h&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; //sort ...

Заполнение массива случайными числами в цикле - C++
Есть массив который заполняется случайным образом. как сделать чтобы он заполнялся случайным образом несколько раз и результаты выводились...

Заполнение класса - C++
Уважаемые форумчане я понимаю что вопрос плёвый, но есть у меня пробелы со строками! Прошу сильно не критиковать! Проблема в следующем я...

Создать несколько классов или элементов класса в цикле - C++
Создать несколько классов в цикле или несколько элементов класса // ConsoleApplication3.cpp : Defines the entry point for the console...

Заполнение map объектами класса - C++
Здравствуйте! Нашел пример заполнения map таким образом: map&lt;string, int&gt; M; M = 1; Но при заполнении map аналогичным образом...

Заполнение статического поля класса с клавиатуры - C++
Доброго времени суток, возникла проблема. Я не могу задать статическое поле с клавиатуры. Задача: добавить статическое поле и 2 метода...

Шаблон класса, параметром которого должны являться наследники определённого класса - C++
Сразу извиняюсь за нубский вопрос. Суть в том, что я хочу сделать шаблон класса, параметром которого должны являтся наследники...

Приём константных векторов класса, как аргументов в методе другого класса - C++
Есть такой класс: class Order { private: int numberOrder; map &lt;string, int&gt; catalogDish; double totalCost; public: ...

Как получить private переменную класса, функцей членом другого класса - C++
Игра змейка: Есть класс поле в котором содержится размеры поля: class field { private: int FIELD_START; int...

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
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;
    }
все равно вызывается деструктор после окончания цикла..
Ответ Создать тему
Опции темы

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