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

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

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

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

19.09.2011, 00:23. Просмотров 636. Ответов 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;
    }
заполняю массив классов в цикле, естественно после этого вызывается деструктор и все это дело убивает...подскажите,как возможно этого избежать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2011, 00:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос заполнение класса в цикле (C++):

Заполнение вектора класса внутри самого класса - C++
class A { private: int a; public: A() { a = 0; }; A get(vector &lt;A&gt;* vec)

Заполнение вектора в цикле - 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 аналогичным образом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
19.09.2011, 03:30 #2
Строку 28 лучше бы записать так:
C++
1
ZapBook tmp(buf,buf1,buf2,t,d,m,y);
А вообще, для этого класса обязательно надо определить конструктор копирования и оператор присваивания (отдельная функция копирования, в общем-то, не нужна).
Кроме того, в программе определённо используется и конструктор по умолчанию (без параметров), но его определения не видно.
Ну а возвращаясь к вопросу, объекты массива z в показанном участке кода вообще не удаляются и, соответственно, деструкторы для них не вызываются. Вызываются деструкторы для объектов tmp. А вот если в строке 28 создаётся ещё и временный объект (тут я не уверен, там ведь инициализация), то при неопределённом конструкторе копирования память будет удаляться дважды, а в массив тогда будут копироваться удалённые уже строки.
0
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;
    }
все равно вызывается деструктор после окончания цикла..
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2011, 07:05
Привет! Вот еще темы с ответами:

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

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

Проверка создания объекта класса BBB из класса AAA и работа с ним - C++
#define @param2; // объявили для выяснения случая: нужен новый или использовать существующий. Class AAA { private: void...

Как обраиться к функции класса через другую функцию класса (друга)? - C++
Пример кода: #include &lt;iostream&gt; using namespace std; class Sasha; class Petya { public: friend class Sasha; ...


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

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

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