0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 46
1

Написать для класса деструктор, выводящий надпись

07.04.2016, 14:35. Показов 722. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста, как написать в 71 строке деструктор, так, чтобы при компиляции выводилось на экран "Destruktor rabotaet"?

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
#include <iostream.h>
#include <string.h>
#include <conio.h>
 
class Employee{
public:
   //Konstruktor bez parametrov
   Employee();
 
   Employee (const char *n, int a, int g);
 
   //Konstruktor s parametrami
   void setEmployee (const char *, int, int);
 
   //Konstruktor kopii
   Employee ( const Employee &);
 
   //Destruktor
   ~Employee ();
 
   void printEmployee ();
private:
   char name[25];
   int age;
   int gaffer;
};
 
Employee::Employee ()  {
age = gaffer = 0;
const char *k="pustoi";
int length = strlen(k);
length = length < 25 ? length : 24;
strncpy (name, k, length);
name[length] = '\0';
 ; }
 
 
void Employee::setEmployee (const char *n, int a, int g)
{
int length = strlen(n);
length = length < 25 ? length : 24;
strncpy (name, n, length);
name[length] = '\0';
age=a;
gaffer=g;
}
 
 
Employee::Employee (const char *n, int a, int g)
{
   setEmployee (n,a,g);
}
 
void Employee::printEmployee ()
{
 
cout <<"Imja slujashego: \n"  << name <<
"\nVozrast: " << '\n' << age << 
"\nStag: " <<'\n' << gaffer << '\n';
}
 
// Konstruktor kopii
Employee::Employee ( const Employee & obj)
    {
    memcpy(name,obj.name,24);
        age = obj.age;
        gaffer = obj.gaffer;
    }
 
 //Destruktor
   Employee:: ~Employee (){cout <<"Destruktor rabotaet";};
 
int main ()
{
clrscr ();
Employee e;
e.printEmployee ();
cout << endl;
e.setEmployee ("Ivan", 21, 1);
Employee e2 ("Egor", 28, 5);
e2.printEmployee();
 
Employee e3(e2);
e3.printEmployee ();
//cout <<"\nDestruktor rabotaet";
getch ();
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2016, 14:35
Ответы с готовыми решениями:

Написать деструктор для данного класса
Как лучше написать деструктор для класса: class Library{ private: struct books{ ...

Дописать конструктор и деструктор для класса
Помогите пожалуйста написать конструктор копии и деструктор, а также вызвать их, чтобы деструктор...

Для класса задать конструктор и деструктор
Ребята,нужна помощь в написании программы. Для класса задать конструктор(для выделения...

Свой деструктор для каждого класса в массиве
Предположим есть класс(описывающий какой либо обьект в нескольких переменных), у него есть...

8
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
07.04.2016, 15:20 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    clrscr();
    {
        Employee e;
        e.printEmployee();
        cout << endl;
        e.setEmployee("Ivan", 21, 1);
        Employee e2("Egor", 28, 5);
        e2.printEmployee();
 
        Employee e3(e2);
        e3.printEmployee();
        //cout <<"\nDestruktor rabotaet";
    }
    getch();
    return 0;
}
Добавлено через 1 минуту
В блок можно взять, у вас после getch() "Destruktor rabotaet"
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 742
07.04.2016, 15:30 3
123c, для того что бы деструктор заработал, необходимо создавать и уничтожать объект.
Как известно если объект создан как как переменная типа класса, то он уничтожается автоматически при выходе из зоны видимости (т.е. из функции, цикла, другого объекта, условия и т.д.) у Вас этого выхода из зоны видимости нет.
При выделении памяти для объекта с помощью оператора new, деструктор сработает при очистке памяти оператором delete.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// объявляем указатель на объект класса Employee 
Employee *e;
e = 0;
 
// выделяем память для объект объект класса Employee 
if (!e) {
  e = new Employee();
}
 
// какие то действия с объектом
e->printEmployee ();
 
//.....
 
 
// очистка памяти
if (e) {
    delete e;
    e = 0;
}
0
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 46
07.04.2016, 15:43  [ТС] 4
Цитата Сообщение от RefSol Посмотреть сообщение
123c, для того что бы деструктор заработал, необходимо создавать и уничтожать объект.
А где это нужно прописывать?
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 742
07.04.2016, 15:57 5
Цитата Сообщение от 123c Посмотреть сообщение
А где это нужно прописывать?
смотрите пример, оператор new создаёт объект (вызывается конструктор); оператор delete -- удаляет объект (вызывается деструктор).
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
08.04.2016, 15:19 6
Цитата Сообщение от RefSol Посмотреть сообщение
C
1
2
3
4
if (e) {
   delete e;
   e = 0;
}
Какой смысл от этой проверки?
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 742
08.04.2016, 15:48 7
ISergey, в таком маленьком и вполне очевидном коде смысл только воспитательный, но когда код становится большим и нелинейным, т.е. последовательность выполнения может быть различной, например, в несколько потоков, с разделением данных, подобные проверки необходимы или надо использовать "умные" сборщики мусора и "умные" указатели, которые осуществляют подобные проверки и проверки выхода из зоны видимости автоматически.
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
08.04.2016, 17:20 8
RefSol, Я хотел этим сказать что проверка указателя на 0 перед оператором delete (это касается стандартной его реализации) попросту бесполезна.
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 742
08.04.2016, 18:28 9
Цитата Сообщение от ISergey Посмотреть сообщение
Я хотел этим сказать что проверка указателя на 0 перед оператором delete (это касается стандартной его реализации) попросту бесполезна
, имеете право, собственно С++ достаточно творческий язык и точек зрения, соответственно, достаточно.
что касается
Цитата Сообщение от ISergey Посмотреть сообщение
это касается стандартной его реализации
, есть несколько реализаций оператора new, в зависимости от компилятора и версии компилятора. Ведь стандартная реализация оператора, это то какие действия выполняет этот оператор после компиляции в соответствии с кодом который генерирует компилятор для данного оператора без перегрузки. Низкоуровневое выделение памяти будет отличаться не только от типа ОС, но и от её версии, например, win 98, win xp и win 10 у всех по разному.
А если сравнивать, например, C++ для *nix систем под процессоры Motorolla или Atmel 32, с С++ под Win на Intel, то действия будут отличаться кардинально.
Кроме того, по стандарту C++ операторы возможно перегружать, new в том числе. В "стандартной реализации" new хорош только в простом линейном коде, а в относительно сложном коде возникает масса проблем, частично устранить эти проблемы помогают следующие, достаточно простые, приёмы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Employee *e;
e = 0;         // обнуление указателя при объявлении
 
 
if (!e) {      // проверка указателя перед созданием объекта
  e = new Employee();
}
 
//.....
 
if (e) {       // проверка указателя перед удалением объекта
    delete e;
    e = 0;     // обнуление указателя при удалении объекта
}
Но и это полностью не спасает, поэтому придумывают сборщики мусора и умные указатели и даже новые парадигмы разработки ПО. Также говоря о стандартах следует отметить, что например STL содержит "умные указатели" и это всё стандарт. Тот код который я привёл в качестве примера, является одним из паттернов решения вопроса выделения памяти, есть другие. Такой паттерн поддерживается компиляторами и хорошо себя зарекомендовал, кроме того он достаточно прост и очевиден, особенно в рамках данного поста, в котором основной задачей является научить человека и помочь ему разобраться, дать повод задуматься самому.
Проблемы выделения памяти, языковых стандартов значительны и рассмотрена во множестве тематической литературы. Поэтому у человека ищущего будет достаточно пищи для размышлений и материалов для понимания.
Благодарю.
0
08.04.2016, 18:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2016, 18:28
Помогаю со студенческими работами здесь

Разработать конструкторы и деструктор для заданного класса
Разработать конструкторы и деструктор для заданного класса. Осуществить инициализацию объектов...

Деструктор для абстрактного класса, использующего static vector
Доброго времени суток. Возникла проблема с написание деструктора абстрактного класса, использующего...

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

class выводящий эллементы другого класса...
Сделать класс GROUP_OBJECT который будит выводить эллементы других классов на экран... помогите...

Деструктор класса
когда мы вызываем деструктор, для удаления динамического массива к примеру, нужно ли в нем каким...

деструктор класса
Здравствуйте! Я скопировал код отсюда https://msdn.microsoft.com/ru-ru/library/6t4fe76c.aspx...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru