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

Вызов оператора базового класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
N@t@lk@
3 / 3 / 0
Регистрация: 30.11.2011
Сообщений: 17
02.12.2011, 14:21     Вызов оператора базового класса #1
Помогите, плиз!
нужно в операторе= класса-наследника вызвать оператор= базового класса. Ошибка при вызове деструктора. Как исправить?

базовый класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include "comp.h"
 
comp::comp()
{
  marka=new char;
  *marka='\0';
  cena=0;
}
 
comp::comp(char *m, int c)
{
  marka=new char[strlen(m)+1];
  strcpy(marka, m);
  if(c<0) puts("Не верно!");
  else cena=c;
}
 
comp::comp(comp &v)
{
  marka=new char[strlen(v.GetMarka())+1];
  strcpy(marka, v.GetMarka());
  cena=v.GetCena();
}
 
comp::~comp()
{
  delete marka;
}
 
comp::comp(char *s)
{
 marka=new char [strlen(s)+1];
 strcpy(marka,s);
 cena=0;
}
 
char *comp::GetMarka(void)
 {return marka;}
 
int comp::GetCena(void)
 {return cena;}
 
void comp::SetMarka(char *m)
 {
  delete marka;
  marka=new char [strlen(m)+ 1];
  strcpy(marka, m);
 }
 
void comp::SetCena(int c)
 {
  if(c<0) puts ("Не верно!");
  else cena=c;
 }
 
void comp::Print(void)
{
  printf("\nмарка компьютера - %s,цена - %d",GetMarka(),GetCena());
}
void comp::Set(void)
{
  char s[50];
  printf("\nВведите марку компьютера - ");
  fflush(stdin);
  gets(s);
  SetMarka(s);
  int v;
  printf("\nВведите цену - ");
  scanf("%d",&v);
  SetCena(v);
}
 
comp comp::operator = (comp &s)  // ОПЕРАТОР БАЗОВОГО КЛАССА
{
  SetMarka(s.GetMarka());
  SetCena(s.GetCena());
}
Класс-наследник

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
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include "comp.h"
#include "psystem.h"
 
psystem::psystem()
{
 system=new char;
 *system='\0';
 type=0;
}
 
psystem::psystem(char *m, int c, char *s, int t): comp(m, c)
{
 system=new char[strlen(s)+1];
 strcpy(system, s);
 type=t;
}
 
psystem::~psystem()
{
 delete system;
}
 
void psystem::SetSystem(char *s)
{
 delete system;
 system=new char[strlen(s)+1];
 strcpy(system, s);
}
 
void psystem::SetType(int t)
{
 type=t;
}
 
char *psystem::GetSystem(void)
{
 return system;
}
 
int psystem::GetType(void)
{
 return type;
}
 
void psystem::Print(void)
{
 comp::Print();
 printf("программная с-ма - %s, тип системы - %d", GetSystem(), GetType());
}
 
void psystem::Set(void)
{
 char s[50];
 int t;
 printf("\nВведите программную с-му: ");
 flushall();
 gets(s);
 SetSystem(s);
 printf("\nВведите тип системы: ");
 scanf("%d", &t);
 SetType(t);
 comp::Set();
}
 
void psystem::Copy(comp &p)
{
  SetMarka(p.GetMarka());
  SetCena(p.GetCena());
}
 
void psystem::Max(comp &v)
{
 if (GetCena()<v.GetCena())
   SetCena(v.GetCena());
}
 
psystem psystem::operator = (psystem &s) //ОПЕРАТОР КЛАССА-НАСЛЕДНИКА
{
  this->comp::operator = ((comp)s);    //вызов оператора базового класса
  this->SetSystem(((psystem)s).GetSystem());
  this->SetType(((psystem)s).GetType());
}
Добавлено через 19 минут
Уже сама разобралась)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
02.12.2011, 14:23     Вызов оператора базового класса #2
Маладец.
И запомни на будущее, что new/delete и new[]/delete[] должны использоваться согласованно.)
N@t@lk@
3 / 3 / 0
Регистрация: 30.11.2011
Сообщений: 17
02.12.2011, 23:29  [ТС]     Вызов оператора базового класса #3
да там не в этом дело. И new/delete я использовала правильно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.12.2011, 23:42     Вызов оператора базового класса #4
Цитата Сообщение от N@t@lk@ Посмотреть сообщение
И new/delete я использовала правильно
Да ну? Вижу в вашем коде целых два места, где используется new[], и ни одного delete[].
Bers
Заблокирован
03.12.2011, 00:05     Вызов оператора базового класса #5
1. В лучшем случае - утечка памяти. В худшем - порча памяти.
2. Рассмотрим код:
C++
1
2
3
this->comp::operator = ((comp)s); * *//вызов оператора базового класса
* this->SetSystem(((psystem)s).GetSystem());
* this->SetType(((psystem)s).GetType());
В нем присутствует оверхед адресации. Что бы вызвать одноименный метод потомка, можно сделать проще:



C++
1
2
3
 сomp::operator = ((comp)s); * *//вызов оператора базового класса
*SetSystem(((psystem)s).GetSystem());
*SetType(((psystem)s).GetType());
То бишь, доступ к данным через this не нужен.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.12.2011, 07:42     Вызов оператора базового класса #6
Цитата Сообщение от Bers Посмотреть сообщение
(psystem)s
Более интересно, зачем создавать копию объекта, для получения его свойств? Тем более, что создание копии в операторе присваивания вполне может привести к рекурсии.
N@t@lk@
3 / 3 / 0
Регистрация: 30.11.2011
Сообщений: 17
03.12.2011, 10:24  [ТС]     Вызов оператора базового класса #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Более интересно, зачем создавать копию объекта, для получения его свойств? Тем более, что создание копии в операторе присваивания вполне может привести к рекурсии.
это я, конечно, зря. Хотя к рекурсии в данном случае не приводит

Добавлено через 2 минуты
Цитата Сообщение от silent_1991 Посмотреть сообщение
Да ну? Вижу в вашем коде целых два места, где используется new[], и ни одного delete[].
Значит, память удалится в деструкторе
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.12.2011, 10:33     Вызов оператора базового класса #8
Цитата Сообщение от N@t@lk@ Посмотреть сообщение
Значит, память удалится в деструкторе
Вот в деструкторе она не правильно и удаляется.
N@t@lk@
3 / 3 / 0
Регистрация: 30.11.2011
Сообщений: 17
03.12.2011, 10:52  [ТС]     Вызов оператора базового класса #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
Вот в деструкторе она не правильно и удаляется.
И как же надо?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2011, 11:11     Вызов оператора базового класса
Еще ссылки по теме:

C++ Вызов конструктора базового класса из порожденного
Вызов наследуемых методов из базового класса C++
Вызов переопределенного метода из методов базового класса C++

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

Или воспользуйтесь поиском по форуму:
LosAngeles
Заблокирован
03.12.2011, 11:11     Вызов оператора базового класса #10
Цитата Сообщение от N@t@lk@ Посмотреть сообщение
marka=new char;
marka=new char[1];

Цитата Сообщение от N@t@lk@ Посмотреть сообщение
psystem::~psystem()
{
delete system;
}
delete [] system;
Yandex
Объявления
03.12.2011, 11:11     Вызов оператора базового класса
Ответ Создать тему
Опции темы

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