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

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

Войти
Регистрация
Восстановить пароль
 
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
#1

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

15.07.2013, 13:32. Просмотров 513. Ответов 14
Метки нет (Все метки)

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

Оператор bool неправельно работает! - C++
Начал изучать С++ и решил написать чето сое, чето несино сложное. Почти сразу сталкнулся с проблемой, вот код: #include &lt;iostream&gt; ...

Как записать правильно? Программа работает но код наверно не верен. - C++
#include &lt;iostream&gt; using namespace std; int main() { long sek; cout &lt;&lt; &quot;Enter the number of senonds: &quot;; ...

Почему не работает конструктор? - C++
подскажите почему не инициализируется а4? Почему не происходит неявного вызова конструктора с одним аргументом, а после обычный конструктор...

Не работает конструктор переноса - C++
Привет всем! такая проблема...создал класс с такими членами private: list&lt;string&gt; m_vertex; //Вершины соединены с...

Не работает конструктор перемещения (C++11) - C++
Прив. Пишу класс подобный string'гу, ну и в процессе изучаю C++. Добрался до оператора и конструктора перемещения. #include &lt;cstdlib&gt; ...

Не работает конструктор по умолчанию - C++
Нужно в конструкторе по умолчанию создать динамический массив и заполнить его элементами, но при компиляции выводится сообщение &quot;Не...

14
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:42 #2
Цитата Сообщение от лилиэн Посмотреть сообщение
я создаю 1 элемент класса точнее указатель first
Цитата Сообщение от лилиэн Посмотреть сообщение
НО! не уничтожает первый и программа завершается..Почему?
Чтобы вызывался деструктор, нужно удалять объект через delete ( delete first; ), ты же выделил его через new !
1
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 13:53  [ТС] #3
Цитата Сообщение от lazybiz Посмотреть сообщение
Чтобы вызывался деструктор, нужно удалять объект через delete ( delete first; ), ты же выделил его через new !
за это спасибо огромное... но почему создаются два элемента класса?? я же всего 1 создаю..
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 13:55 #4
Ну так ты же из конструктора node вызываешь конструктор human.
1
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 14:00  [ТС] #5
Цитата Сообщение от lazybiz Посмотреть сообщение
Ну так ты же из конструктора node вызываешь конструктор human.
ну да 1 раз... а 2й раз???? и еще так куда вставлять удаление...а то я совсем туплю
0
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
15.07.2013, 14:11  [ТС] #6
Цитата Сообщение от lazybiz Посмотреть сообщение
Ну так ты же из конструктора node вызываешь конструктор human.
с созданием 2х обьектов разобралась...исправила...но про удаление не поняла... как удалять и где удалять???
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 14:23 #7
В main, перед return 1;
1
alsav22
5421 / 4816 / 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;
}
0
лилиэн
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====================================================================";
}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.07.2013, 03:49 #10
Цитата Сообщение от лилиэн Посмотреть сообщение
новый вариант на всяк случай...можете запустить посмотреть что происходит
А ошибки исправить?
Цитата Сообщение от лилиэн Посмотреть сообщение
И ошибка в конструкторе:
Как память выделяли, так и выделяете... И не только в конструкторе.

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

Не по теме:

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


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

Не по теме:

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

0
лилиэн
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");
      }
};
0
Croessmah
Эксперт CЭксперт С++
13416 / 7569 / 855
Регистрация: 27.09.2012
Сообщений: 18,632
Записей в блоге: 3
Завершенные тесты: 1
16.07.2013, 09:47 #14
Цитата Сообщение от лилиэн Посмотреть сообщение
delete this;
Это зачем Вам?
0
alsav22
5421 / 4816 / 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====================================================================";
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 13:12
Привет! Вот еще темы с ответами:

Не работает конструктор копирования - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; class my {int x1,x2,y1,y2,col; public: my(int _x1=20, int _y1=5,...

Конструктор копирования не работает - C++
Прошу вас помочь разобраться с конструктором копирования. Проблема в следующем при вызове конструктора копирование вылетает ошибка не...

Не работает конструктор копирования - C++
Всем доброго времени суток. Помогите пожалуйста, уже битиый день не могу побороть почему не работает конструктор копирования :cry: ...

Не работает конструктор копирования - C++
Пишу свой класс матрица. В конструкторе копирования вылезла ошибка, решить которую мне не удается. Отладчиком проходился не один раз,...


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

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

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