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

Неправельно работает конструктор(наверно) - C++

Восстановить пароль Регистрация
 
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 13:32     Неправельно работает конструктор(наверно) #1
Вот класс и вот конструктор думаю знающие люди разберутся я создаю 1 элемент класса точнее указатель first на элемент который будет головным элементом динамического списка... если запустите программу увидите что создается 2 элемента и потом деструктор уничтожает 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
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include<iostream>
#include<cstring>
using namespace std;
class human
{
      protected:
              int age;
              int heigh;
              char *name;
              static int copies;
              int obj_id;
      public:
             human();//konstructor
             human(human& h);//konstruktor kopirovania
             ~human();//destruktor 
             int checkid(int id);//ïðîâåðêГ* åñëè èäøêГ* îáüåêòГ* Г*ГіГ¦Г*Г*Гї Г*Г*Г¬ 
             void displayinfo();  
};
class node:public human
{
      private:
      node* next;
      public:
      node()
      {
            human();
            next=NULL;
      }
};
int human::copies=0;
int main()
{
    const node *first=new node;
    system("color 1B");
    cout<<"\n";
    system("pause");
    cout<<"==========================ENding PRogramm=======================";
    return 1;
}
 
//--------------------------Konstructor
human::human()
             {
                    copies++;
                    obj_id=copies;
                    cout<<"\ncreating new data with id="<<obj_id;
                    cout<<"\nEnter name:";
                    char tmp_name[20];
                    cin>>tmp_name;
                    int lengh;
                    lengh=strlen(tmp_name);
                    name= new char[lengh];
                    strcpy(name,tmp_name);
                    cout<<"\nEnter age:";
                    cin>>age;
                    cout<<"\nEnter heigh:";
                    cin>>heigh;
                    cout<<"\nEntering data completed\n";
             }
//----------------------------copy constructor
human::human(human& h)
             {
                    copies++;
                    obj_id=copies;
                    cout<<"\ncreating new data with id="<<obj_id;
                    cout<<"\ncopying  information from id="<<h.obj_id;
                    int lengh;
                    lengh=strlen(h.name);
                    name= new char[lengh];
                    strcpy(name,h.name);
                    age=h.age;
                    heigh=h.heigh;
                    cout<<"\nCopiing data compleeted!";
                    label1:
                    cout<<"\nChange smth?\n1)NO\n2)YES";
                    int choise;
                    cout<<"\nYour choise:";
                    cin>>choise;
                    switch(choise)
                    {
                                 case 1: break;
                                 case 2:
                                      {
                                               label2:
                                               cout<<"\nWhat should we change?";
                                               cout<<"\n1)Name";
                                               cout<<"\n2)Age";
                                               cout<<"\n3)Heigh";
                                               cout<<"\nYour choise?";
                                               int choise2;
                                               cin>>choise2;
                                               switch(choise2)
                                               {
                                                             case 1:
                                                                  {delete[] name;
                                                                   cout<<"\nEnter new name:";
                                                                   char tmp_name[20];
                                                                   cin>>tmp_name;
                                                                   int lengh;
                                                                   lengh=strlen(tmp_name);
                                                                   name= new char[lengh];
                                                                   strcpy(name,tmp_name);
                                                                   break;
                                                                   }
                                                             case 2:
                                                                  {
                                                                    cout<<"\nEnter new age:";
                                                                    cin>>age;
                                                                    break;
                                                                  }
                                                             case3:
                                                                   {
                                                                     cout<<"\nEnter heigh:";
                                                                     cin>>heigh;
                                                                     break;
                                                                   }
                                                             default:
                                                                     {
                                                                           cout<<"no such option aviabe!!!";
                                                                           goto label1;
                                                                     }               
                                               }
                                               cout<<"\n Change smth else?\n1)NO\n2)YES";
                                               cout<<"\nYour choise?";
                                               int choise3;
                                               cin>>choise3;
                                               switch(choise3)
                                               {
                                                              case 1:break;
                                                              case 2:goto label2;break;
                                                              default:cout<<"No such option aviable!!rerurning to main prog!";
                                               }
                                               break;
                                      }
                                 default: 
                                      {
                                          cout<<"\nNo such option aviable!!";
                                          goto label1;
                                      }
                                 
                    }
                    cout<<"\nCopying data completed\n";
             }
//-------------------------------------Destruktor
 human::~human()
             {
                     copies--;
                     cout<<"\ndeleting object with id"<<obj_id;
                     cout<<"\n";
                     system("pause");
                     delete[] name;
             }    
//------------------------------------Metodi obiekta
int human::checkid(int id)
{
            if(obj_id==id)
            return 1;
            else 
            return 0;
}
void human::displayinfo()
{
            cout<<"\nDisplaying info fot id:"<<obj_id;
            cout<<"\nName:"<<name<<"\nAge:"<<age<<"\Heigh:"<<heigh;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:42     Неправельно работает конструктор(наверно) #2
Цитата Сообщение от лилиэн Посмотреть сообщение
я создаю 1 элемент класса точнее указатель first
Цитата Сообщение от лилиэн Посмотреть сообщение
НО! не уничтожает первый и программа завершается..Почему?
Чтобы вызывался деструктор, нужно удалять объект через delete ( delete first; ), ты же выделил его через new !
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 13:53  [ТС]     Неправельно работает конструктор(наверно) #3
Цитата Сообщение от lazybiz Посмотреть сообщение
Чтобы вызывался деструктор, нужно удалять объект через delete ( delete first; ), ты же выделил его через new !
за это спасибо огромное... но почему создаются два элемента класса?? я же всего 1 создаю..
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:55     Неправельно работает конструктор(наверно) #4
Ну так ты же из конструктора node вызываешь конструктор human.
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 14:00  [ТС]     Неправельно работает конструктор(наверно) #5
Цитата Сообщение от lazybiz Посмотреть сообщение
Ну так ты же из конструктора node вызываешь конструктор human.
ну да 1 раз... а 2й раз???? и еще так куда вставлять удаление...а то я совсем туплю
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 14:11  [ТС]     Неправельно работает конструктор(наверно) #6
Цитата Сообщение от lazybiz Посмотреть сообщение
Ну так ты же из конструктора node вызываешь конструктор human.
с созданием 2х обьектов разобралась...исправила...но про удаление не поняла... как удалять и где удалять???
castaway
Эксперт С++
4838 / 2977 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:23     Неправельно работает конструктор(наверно) #7
В main, перед return 1;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.07.2013, 15:18     Неправельно работает конструктор(наверно) #8
Цитата Сообщение от лилиэн Посмотреть сообщение
но почему создаются два элемента класса?? я же всего 1 создаю..
Потому что, перед инициализацией объекта производного класса, вызывается констуктор базового класса:
C++
1
2
3
4
5
6
7
8
9
10
11
class node:public human
{
      private:
      node* next;
      public:
      node() // : human() // здесь конструктор (по умолчанию) базового класса вызывается явно или (в вашем случае) не явно.
      {
            //human();
            next=NULL;
      }
};
Поэтому писать, в теле конструктора производного класса, вызов конструктора базового класса - не нужно. Объект создаётся один - node, но в нём, как часть, присутствует и объект базового класса, для инициализации которого, и вызывается конструктор базового класса.

Добавлено через 17 минут
И ошибка в конструкторе:
C++
1
2
3
4
int lengh;
lengh = strlen(tmp_name);
name = new char[lengh + 1]; // памяти нужно выделять на 1 больше ( для  '\0'), чем выдаёт strlen().
strcpy(name, tmp_name);
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    const node *first = new node;
    system("color 1B");
    cout<<"\n";
    
    delete first;
    
    cout<<"==========================ENding PRogramm=======================";
    system("pause");
    return 1;
}
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 18:28  [ТС]     Неправельно работает конструктор(наверно) #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что, перед инициализацией объекта производного класса, вызывается констуктор базового класса:
C++
1
2
3
4
5
6
7
8
9
10
11
class node:public human
{
      private:
      node* next;
      public:
      node() // : human() // здесь конструктор (по умолчанию) базового класса вызывается явно или (в вашем случае) не явно.
      {
            //human();
            next=NULL;
      }
};
Поэтому писать, в теле конструктора производного класса, вызов конструктора базового класса - не нужно. Объект создаётся один - node, но в нём, как часть, присутствует и объект базового класса, для инициализации которого, и вызывается конструктор базового класса.

Добавлено через 17 минут
И ошибка в конструкторе:
C++
1
2
3
4
int lengh;
lengh = strlen(tmp_name);
name = new char[lengh + 1]; // памяти нужно выделять на 1 больше ( для  '\0'), чем выдаёт strlen().
strcpy(name, tmp_name);
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    const node *first = new node;
    system("color 1B");
    cout<<"\n";
    
    delete first;
    
    cout<<"==========================ENding PRogramm=======================";
    system("pause");
    return 1;
}
все так понятно и ясно!!Огромное вам спасибо!!!можно еще 1 вопрос...я хочу сделать целый динамический список node-оф ))узлов то бишь..ну удалять же мне вручную каждый из них в мэйне? как сделать так чтобы при выходе из проги они явно удалялись..как в моем случае после завершения пишется что удаляется объект с н-ой айдишкой... можно сделать чтобы вместо этого при удалении узлов писалось какой узел удаляется.Это надо делать деструктор в node но что и как там удалять?удалять как в случае с first?допустим:
C++
1
2
3
4
5
~node()
{
cout<<"deleting element with id:"<<tmp->obj_id;//вывести ид
delete previous_node->next;//а чтобы удалить то  надо отдельно хранить адрес прошлого узла?
}
Добавлено через 13 минут
сделала так:
C++
1
2
3
4
5
6
7
 ~node()
      {
             cout<<"\ndeleting node with id:"<<this->obj_id;
             delete this;
             cout<<"\n";
             system("pause");
      }
но всеравно не удаляется!!!
новый вариант на всяк случай...можете запустить посмотреть что происходит
Кликните здесь для просмотра всего текста
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
//peregruzka vseh operatorov;
#include<iostream>
#include<cstring>
using namespace std;
class human
{
      protected:
              int age;
              int heigh;
              char *name;
              static int copies;
              int obj_id;
      public:
             human();//konstructor
             human(human& h);//konstruktor kopirovania
             ~human();//destruktor 
             int checkid(int id);//ïðîâåðêГ* åñëè èäøêГ* îáüåêòГ* Г*ГіГ¦Г*Г*Гї Г*Г*Г¬ 
             void displayinfo(); 
             human& operator=(human& h);//ïåðåãðóçêГ* ïðèñâГ*ГЁГўГ*Г*ГЁГї 
};
class node:public human
{
      private:
      node* next;
      public:
      node()
      {
            next=NULL;
      }
      ~node()
      {
             cout<<"\ndeleting node with id:"<<this->obj_id;
             delete this;
             cout<<"\n";
             system("pause");
      }
};
int human::copies=0;
int main()
{
    const node *first=new node;
    human h1;
    human h2(h1);
    human h3;
    h3=h1;
    h1.displayinfo();
    h2.displayinfo();
    h3.displayinfo();
    system("color 1B");
    cout<<"\n";
    system("pause");
    system("cls");
    cout<<"==========================ENding PRogramm===========================";
    return 1;
}
 
//--------------------------Konstructor
human::human()
             {
                    cout<<"\n====================================================================";
                    copies++;
                    obj_id=copies;
                    cout<<"\ncreating new data with id="<<obj_id;
                    cout<<"\nEnter name:";
                    char tmp_name[20];
                    cin>>tmp_name;
                    int lengh;
                    lengh=strlen(tmp_name);
                    name= new char[lengh];
                    strcpy(name,tmp_name);
                    cout<<"\nEnter age:";
                    cin>>age;
                    cout<<"\nEnter heigh:";
                    cin>>heigh;
                    cout<<"\nEntering data completed\n";
                    cout<<"\n====================================================================\n";
                    system("pause");
                    system("cls");
             }
//----------------------------copy constructor
human::human(human& h)
             {
                    cout<<"\n====================================================================";
                    copies++;
                    obj_id=copies;
                    cout<<"\ncreating new data with id="<<obj_id;
                    cout<<"\ncopying  information from id="<<h.obj_id;
                    int lengh;
                    lengh=strlen(h.name);
                    name= new char[lengh];
                    strcpy(name,h.name);
                    age=h.age;
                    heigh=h.heigh;
                    cout<<"\nCopiing data compleeted!";
                    label1:
                    cout<<"\nChange smth?\n1)NO\n2)YES";
                    int choise;
                    cout<<"\nYour choise:";
                    cin>>choise;
                    switch(choise)
                    {
                                 case 1: break;
                                 case 2:
                                      {
                                               label2:
                                               cout<<"\nWhat should we change?";
                                               cout<<"\n1)Name";
                                               cout<<"\n2)Age";
                                               cout<<"\n3)Heigh";
                                               cout<<"\nYour choise?";
                                               int choise2;
                                               cin>>choise2;
                                               switch(choise2)
                                               {
                                                             case 1:
                                                                  {delete[] name;
                                                                   cout<<"\nEnter new name:";
                                                                   char tmp_name[20];
                                                                   cin>>tmp_name;
                                                                   int lengh;
                                                                   lengh=strlen(tmp_name);
                                                                   name= new char[lengh];
                                                                   strcpy(name,tmp_name);
                                                                   break;
                                                                   }
                                                             case 2:
                                                                  {
                                                                    cout<<"\nEnter new age:";
                                                                    cin>>age;
                                                                    break;
                                                                  }
                                                             case3:
                                                                   {
                                                                     cout<<"\nEnter heigh:";
                                                                     cin>>heigh;
                                                                     break;
                                                                   }
                                                             default:
                                                                     {
                                                                           cout<<"no such option aviabe!!!";
                                                                           goto label1;
                                                                     }               
                                               }
                                               cout<<"\n Change smth else?\n1)NO\n2)YES";
                                               cout<<"\nYour choise?";
                                               int choise3;
                                               cin>>choise3;
                                               switch(choise3)
                                               {
                                                              case 1:break;
                                                              case 2:goto label2;break;
                                                              default:cout<<"No such option aviable!!rerurning to main prog!";
                                               }
                                               break;
                                      }
                                 default: 
                                      {
                                          cout<<"\nNo such option aviable!!";
                                          goto label1;
                                      }
                                 
                    }
                    cout<<"\nCopying data completed\n";
                    cout<<"\n====================================================================\n";
                    system("pause");
                    system("cls");
             }
//-------------------------------------Destruktor
 human::~human()
             {
                     copies--;
                     cout<<"\ndeleting object with id"<<obj_id;
                     cout<<"\n";
                     system("pause");
                     delete[] name;
             }   
//-------------------------------------Peregruzka prisvaivania
human& human::operator=(human& h)
{
       cout<<"\n====================================================================";
                    cout<<"\nassigning new data to id="<<obj_id;
                    cout<<"\ncopying  information from id="<<h.obj_id;
                    int lengh;
                    lengh=strlen(h.name);
                    delete name;
                    name= new char[lengh];
                    strcpy(name,h.name);
                    age=h.age;
                    heigh=h.heigh;
                    cout<<"\nRefreshing data compleeted!";
                    label1:
                    cout<<"\nChange smth?\n1)NO\n2)YES";
                    int choise;
                    cout<<"\nYour choise:";
                    cin>>choise;
                    switch(choise)
                    {
                                 case 1: break;
                                 case 2:
                                      {
                                               label2:
                                               cout<<"\nWhat should we change?";
                                               cout<<"\n1)Name";
                                               cout<<"\n2)Age";
                                               cout<<"\n3)Heigh";
                                               cout<<"\nYour choise?";
                                               int choise2;
                                               cin>>choise2;
                                               switch(choise2)
                                               {
                                                             case 1:
                                                                  {delete[] name;
                                                                   cout<<"\nEnter new name:";
                                                                   char tmp_name[20];
                                                                   cin>>tmp_name;
                                                                   int lengh;
                                                                   lengh=strlen(tmp_name);
                                                                   name= new char[lengh];
                                                                   strcpy(name,tmp_name);
                                                                   break;
                                                                   }
                                                             case 2:
                                                                  {
                                                                    cout<<"\nEnter new age:";
                                                                    cin>>age;
                                                                    break;
                                                                  }
                                                             case3:
                                                                   {
                                                                     cout<<"\nEnter heigh:";
                                                                     cin>>heigh;
                                                                     break;
                                                                   }
                                                             default:
                                                                     {
                                                                           cout<<"no such option aviabe!!!";
                                                                           goto label1;
                                                                     }               
                                               }
                                               cout<<"\n Change smth else?\n1)NO\n2)YES";
                                               cout<<"\nYour choise?";
                                               int choise3;
                                               cin>>choise3;
                                               switch(choise3)
                                               {
                                                              case 1:break;
                                                              case 2:goto label2;break;
                                                              default:cout<<"No such option aviable!!rerurning to main prog!";
                                               }
                                               break;
                                      }
                                 default: 
                                      {
                                          cout<<"\nNo such option aviable!!";
                                          goto label1;
                                      }
                                 
                    }
                    cout<<"\nCopying data completed\n";
                    cout<<"\n====================================================================\n";
                    system("pause");
                    system("cls");
       
}
//------------------------------------Metodi obiekta
int human::checkid(int id)
{
            if(obj_id==id)
            return 1;
            else 
            return 0;
}
void human::displayinfo()
{
            cout<<"\n====================================================================";
            cout<<"\nDisplaying info fot id:"<<obj_id;
            cout<<"\nName:"<<name<<"\nAge:"<<age<<"\nHeigh:"<<heigh;
            cout<<"\n====================================================================";
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.07.2013, 03:49     Неправельно работает конструктор(наверно) #10
Цитата Сообщение от лилиэн Посмотреть сообщение
новый вариант на всяк случай...можете запустить посмотреть что происходит
А ошибки исправить?
Цитата Сообщение от лилиэн Посмотреть сообщение
И ошибка в конструкторе:
Как память выделяли, так и выделяете... И не только в конструкторе.

Цитата Сообщение от лилиэн Посмотреть сообщение
.я хочу сделать целый динамический список node-оф
У вас в коде неправильное отношение между node и human.Открытое наследование тут не подходит (node не является human). В node должно быть поле human (данные узла). И должен быть ещё класс Список (сосотоящий из node) с полями: начало списка, конец списка; методами: создание списка, добавление узла в список, удаление узла из списка, удаление списка. Смотрите реализации списка структур.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
16.07.2013, 04:04     Неправельно работает конструктор(наверно) #11

Не по теме:

во программа, комп повис после неё


Цитата Сообщение от лилиэн Посмотреть сообщение
я хочу сделать целый динамический список node-оф
может std::vector здесь подойдет?
alsav22
16.07.2013, 05:15
  #12

Не по теме:

Цитата Сообщение от soican Посмотреть сообщение
может std::vector здесь подойдет?
Для вектора не нужны node. Задание, наверное, именно список создать.

лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
16.07.2013, 09:37  [ТС]     Неправельно работает конструктор(наверно) #13
Цитата Сообщение от alsav22 Посмотреть сообщение
А ошибки исправить? Как память выделяли, так и выделяете... И не только в конструкторе.


У вас в коде неправильное отношение между node и human.Открытое наследование тут не подходит (node не является human). В node должно быть поле human (данные узла). И должен быть ещё класс Список (сосотоящий из node) с полями: начало списка, конец списка; методами: создание списка, добавление узла в список, удаление узла из списка, удаление списка. Смотрите реализации списка структур.
Вот переделала отношение между узлом и хуманом ...исходная проблема а именно не удаляется обьект все еще в силе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class node
{
      private:
      human h_data;
      node* next;
      public:
      node()
      {
            next=NULL;
      }
      ~node()
      {
             cout<<"\ndeleting node with id:"<<h_data.obj_id;
             delete this;
             cout<<"\n";
             system("pause");
      }
};
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11809 / 6788 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 09:47     Неправельно работает конструктор(наверно) #14
Цитата Сообщение от лилиэн Посмотреть сообщение
delete this;
Это зачем Вам?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 13:12     Неправельно работает конструктор(наверно)
Еще ссылки по теме:

C++ не работает конструктор копирования
Не работает конструктор перемещения (C++11) C++
Не работает конструктор по умолчанию C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.07.2013, 13:12     Неправельно работает конструктор(наверно) #15
Цитата Сообщение от лилиэн Посмотреть сообщение
а именно не удаляется обьект все еще в силе
Исправить ошибки, с выделением памяти под name, тоже ещё в силе.
Вот так сделайте, и будет удаляться:
C++
1
2
3
4
5
6
 ~node()
      {
             cout << "\ndeleting node" << endl;
             cout<<"\n";
             system("pause");
      }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    const node *first = new node;
    human h1;
    human h2(h1);
    human h3;
    h3 = h1;
    h1.displayinfo();
    h2.displayinfo();
    h3.displayinfo();
    system("color 1B");
    cout<<"\n";
    system("pause");
    system("cls");
    cout<<"==========================ENding PRogramm===========================";
    
    delete first;
    
    return 1;
}
Добавлено через 4 минуты
Цитата Сообщение от лилиэн Посмотреть сообщение
Вот переделала отношение между узлом и хуманом
А это?
Цитата Сообщение от alsav22 Посмотреть сообщение
В node должно быть поле human (данные узла). И должен быть ещё класс Список (сосотоящий из node) с полями: начало списка, конец списка; методами: создание списка, добавление узла в список, удаление узла из списка, удаление списка. Смотрите реализации списка структур.
Примерно так:
Кликните здесь для просмотра всего текста
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
#include<iostream>
#include<cstring>
using namespace std;
 
class human
{
      protected:
              int age;
              int heigh;
              char *name;
              static int copies;
              int obj_id;
      public:
             human();//konstructor
             human(human& h);//konstruktor kopirovania
             ~human();//destruktor 
             int checkid(int id);//проверка если идшка обьекта нужная нам 
             void displayinfo(); 
             human& operator=(human& h);//перегрузка присваивания 
};
 
int human::copies = 0;
 
class node
{
   public:
      human h;
      node* next;
        
      node() : next(NULL)
      {}
      
      ~node()
      {
             cout << "\ndeleting node" << endl;
             cout<<"\n";
             system("pause");
      }
     
};
 
class list
{
        node *first;
        node *last;
    
    public:
        list() : first(0), last(0)
        {}
        
        void addnode()
        {
            node* add = new node;    // новый элемент списка
            
            if (first == NULL)       // если список пустой, то в начало
                first = add;         // first начало списка
            else  last ->next = add; // если список не пустой, то в конец
            last = add;              // last конец списка
        }
 
        void show()
        {
            node* curr = first;
            while (curr)
            {
                curr ->h.displayinfo();
                curr = curr ->next;
            }
        }
        
        ~list()
        {
                node *temp;
                while (first != 0)
                {
                    temp = first ->next;
                    delete first;
                    first = temp;
                }
        }
};
 
 
int main()
{
    list L;
    
    cout << "\nEnter the number of items in the list: ";
    int n;
    cin >> n;
    
    for (int i = 0; i < n; ++i)
        L.addnode();
    
    L.show();
    
    system("color 1B");
    cout<<"\n";
    system("pause");
    system("cls");
    
    cout<<"==========================ENding PRogramm===========================";
    
    return 1;
}
 
//--------------------------Konstructor
human::human()
             {
                    cout<<"\n====================================================================";
                    copies++;
                    obj_id=copies;
                    cout<<"\ncreating new data with id="<<obj_id;
                    cout<<"\nEnter name:";
                    char tmp_name[20];
                    cin>>tmp_name;
                    int lengh;
                    lengh=strlen(tmp_name);
                    name= new char[lengh + 1];
                    strcpy(name,tmp_name);
                    cout<<"\nEnter age:";
                    cin>>age;
                    cout<<"\nEnter heigh:";
                    cin>>heigh;
                    cout<<"\nEntering data completed\n";
                    cout<<"\n====================================================================\n";
                    system("pause");
                    system("cls");
             }
//----------------------------copy constructor
human::human(human& h)
             {
                    cout<<"\n====================================================================";
                    copies++;
                    obj_id=copies;
                    cout<<"\ncreating new data with id="<<obj_id;
                    cout<<"\ncopying  information from id="<<h.obj_id;
                    int lengh;
                    lengh=strlen(h.name);
                    name= new char[lengh + 1];
                    strcpy(name,h.name);
                    age=h.age;
                    heigh=h.heigh;
                    cout<<"\nCopiing data compleeted!";
                    label1:
                    cout<<"\nChange smth?\n1)NO\n2)YES";
                    int choise;
                    cout<<"\nYour choise:";
                    cin>>choise;
                    switch(choise)
                    {
                                 case 1: break;
                                 case 2:
                                      {
                                               label2:
                                               cout<<"\nWhat should we change?";
                                               cout<<"\n1)Name";
                                               cout<<"\n2)Age";
                                               cout<<"\n3)Heigh";
                                               cout<<"\nYour choise?";
                                               int choise2;
                                               cin>>choise2;
                                               switch(choise2)
                                               {
                                                             case 1:
                                                                  {delete[] name;
                                                                   cout<<"\nEnter new name:";
                                                                   char tmp_name[20];
                                                                   cin>>tmp_name;
                                                                   int lengh;
                                                                   lengh=strlen(tmp_name);
                                                                   name= new char[lengh + 1];
                                                                   strcpy(name,tmp_name);
                                                                   break;
                                                                   }
                                                             case 2:
                                                                  {
                                                                    cout<<"\nEnter new age:";
                                                                    cin>>age;
                                                                    break;
                                                                  }
                                                             case3:
                                                                   {
                                                                     cout<<"\nEnter heigh:";
                                                                     cin>>heigh;
                                                                     break;
                                                                   }
                                                             default:
                                                                     {
                                                                           cout<<"no such option aviabe!!!";
                                                                           goto label1;
                                                                     }               
                                               }
                                               cout<<"\n Change smth else?\n1)NO\n2)YES";
                                               cout<<"\nYour choise?";
                                               int choise3;
                                               cin>>choise3;
                                               switch(choise3)
                                               {
                                                              case 1:break;
                                                              case 2:goto label2;break;
                                                              default:cout<<"No such option aviable!!rerurning to main prog!";
                                               }
                                               break;
                                      }
                                 default: 
                                      {
                                          cout<<"\nNo such option aviable!!";
                                          goto label1;
                                      }
                                 
                    }
                    cout<<"\nCopying data completed\n";
                    cout<<"\n====================================================================\n";
                    system("pause");
                    system("cls");
             }
//-------------------------------------Destruktor
 human::~human()
             {
                     copies--;
                     cout<<"\ndeleting object with id"<<obj_id;
                     cout<<"\n";
                     system("pause");
                     delete[] name;
             }   
//-------------------------------------Peregruzka prisvaivania
human& human::operator=(human& h)
{
       cout<<"\n====================================================================";
                    cout<<"\nassigning new data to id="<<obj_id;
                    cout<<"\ncopying  information from id="<<h.obj_id;
                    int lengh;
                    lengh=strlen(h.name);
                    delete name;
                    name= new char[lengh + 1];
                    strcpy(name,h.name);
                    age=h.age;
                    heigh=h.heigh;
                    cout<<"\nRefreshing data compleeted!";
                    label1:
                    cout<<"\nChange smth?\n1)NO\n2)YES";
                    int choise;
                    cout<<"\nYour choise:";
                    cin>>choise;
                    switch(choise)
                    {
                                 case 1: break;
                                 case 2:
                                      {
                                               label2:
                                               cout<<"\nWhat should we change?";
                                               cout<<"\n1)Name";
                                               cout<<"\n2)Age";
                                               cout<<"\n3)Heigh";
                                               cout<<"\nYour choise?";
                                               int choise2;
                                               cin>>choise2;
                                               switch(choise2)
                                               {
                                                             case 1:
                                                                  {delete[] name;
                                                                   cout<<"\nEnter new name:";
                                                                   char tmp_name[20];
                                                                   cin>>tmp_name;
                                                                   int lengh;
                                                                   lengh=strlen(tmp_name);
                                                                   name= new char[lengh + 1];
                                                                   strcpy(name,tmp_name);
                                                                   break;
                                                                   }
                                                             case 2:
                                                                  {
                                                                    cout<<"\nEnter new age:";
                                                                    cin>>age;
                                                                    break;
                                                                  }
                                                             case3:
                                                                   {
                                                                     cout<<"\nEnter heigh:";
                                                                     cin>>heigh;
                                                                     break;
                                                                   }
                                                             default:
                                                                     {
                                                                           cout<<"no such option aviabe!!!";
                                                                           goto label1;
                                                                     }               
                                               }
                                               cout<<"\n Change smth else?\n1)NO\n2)YES";
                                               cout<<"\nYour choise?";
                                               int choise3;
                                               cin>>choise3;
                                               switch(choise3)
                                               {
                                                              case 1:break;
                                                              case 2:goto label2;break;
                                                              default:cout<<"No such option aviable!!rerurning to main prog!";
                                               }
                                               break;
                                      }
                                 default: 
                                      {
                                          cout<<"\nNo such option aviable!!";
                                          goto label1;
                                      }
                                 
                    }
                    cout<<"\nCopying data completed\n";
                    cout<<"\n====================================================================\n";
                    system("pause");
                    system("cls");
                    return *this;
       
}
//------------------------------------Metodi obiekta
int human::checkid(int id)
{
            if(obj_id==id)
            return 1;
            else 
            return 0;
}
void human::displayinfo()
{
            cout<<"\n====================================================================";
            cout<<"\nDisplaying info fot id:"<<obj_id;
            cout<<"\nName:"<<name<<"\nAge:"<<age<<"\nHeigh:"<<heigh;
            cout<<"\n====================================================================";
}
Yandex
Объявления
16.07.2013, 13:12     Неправельно работает конструктор(наверно)
Ответ Создать тему
Опции темы

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