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

Деструктор уничтожает 3 объекта класса. Почему?

15.10.2014, 20:05. Показов 746. Ответов 17
Метки нет (Все метки)

Деструктор уничтожает 3 объекта класса. Не понимаю почему. У меня же 2 объекта используются V и V1. Знающие люди, объясните

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
#include <iostream>
#include <string>
#include <cmath>
#include <conio.h>
#include <list>
 
using namespace std;
 
class kvadrat
{
private:
    int number;
    float x1, area, perimetr;
 
public:
    float Getx1(){return x1;}; //метод возвращает значения в данные класса
    float GetArea(){return area;};
    float GetPerimetr(){return perimetr;};
    void Set(float x);
 
    int GetName(){return number;};
    void Area();
    void Perimetr();
    int Srav(kvadrat V1);
    int Srav1(kvadrat V1);
 
    kvadrat()//конструкторпоумолчанию
        {
        number=1;
        x1=4;
        };
    kvadrat(int a)//конструкторпопараметрам
        {
        number=2;
        x1=a;                       
        };
    ~kvadrat() //деструктор
    { cout<<endl<<"Объект уничтожен!"; } 
}V,V1(6);
 
void kvadrat :: Area()
{
    area=pow(x1,2);
}
void kvadrat :: Perimetr()
{
    perimetr=x1*4;
}
void kvadrat :: Set(float x)
{
    x1=x; if(x1<0) x1=-x1 ;
}   
 
int  kvadrat :: Srav(kvadrat V1)
{
    if (area == V1.area)
        return 0;
    else
    if (area > V1.area)
    {
        return 1;
    }
    else
        return 2;
}
int  kvadrat :: Srav1(kvadrat V1)
{
    if (perimetr == V1.perimetr)
        return 0;
    else
    if (perimetr > V1.perimetr)
    {
        return 1;
    }
    else
        return 2;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
        cout<<endl<<"Квадрат №"<<V.GetName()<<endl;
        cout<<"x = : "<<V.Getx1()<<endl;
 
        cout<<endl<<"Квадрат №"<<V1.GetName()<<endl;
        cout<<"x = : "<<V1.Getx1()<<endl;
 
    V.Area();
    cout<<endl<<"Площадь квадрата №"<<V.GetName()<<":  "<<V.GetArea();
    V1.Area();
    cout<<endl<<"Площадь квадрата №"<<V1.GetName()<<":  "<<V1.GetArea();
    if(V.Srav(V1)==0)
        cout<<endl<<"Площадь квадратов одинакова.";
    else
        if(V.Srav(V1)==1)
            cout<<endl<<endl<<"Площадь первого квадрата больше второго.";
        else
            if(V.Srav(V1)==2)
                cout<<endl<<endl<<"Площадь второго квадрата больше первого.";
 
    V.Perimetr();
    cout<<endl<<"Периметр квадрата №1"<<": "<<V.GetPerimetr();
    V1.Perimetr();
    cout<<endl<<"Периметр квадрата №2"<<": "<<V1.GetPerimetr();
    if(V.Srav1(V1)==0)
        cout<<endl<<"Периметр квадратов одинаков.";
    else
        if(V.Srav1(V1)==1)
            cout<<endl<<endl<<"Периметр первого квадрата больше второго."<<endl;
        else
            if(V.Srav1(V1)==2)
                cout<<endl<<endl<<"Периметр второго квадрата больше первого."<<endl;
 
 
 
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2014, 20:05
Ответы с готовыми решениями:

Почему при помещении объекта в list вызывается конструктор и деструктор?
Нужна помощь опытного программиста. Не могу понять почему при помещение объекта в list вызывается...

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Существует ли деструктор для объекта класса FORM?
При работе с формами инициализация формы происходит методом : public constructor; begin...

Везде пугают sudo rm -rf, мол все уничтожает. Пробую - не получается. Почему?
У меня куча разделов с кучей подразделов. Ubuntu так и не запускается без флэшки. Я даже не могу...

17
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
15.10.2014, 20:14 2
Цитата Сообщение от VitekSR Посмотреть сообщение
C++
1
2
int Srav(kvadrat V1); 
int Srav1(kvadrat V1);
при каждом вызове Srav или Srav1 вызывается конструктор объекта kvadrat V1, а затем его деструктор перед завершением функции.
Если это тебе не нужно, следует сделать, чтоб функции принимали ссылки.
C++
1
2
int Srav(const kvadrat& V1); 
int Srav1(const kvadrat& V1);
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
15.10.2014, 20:16  [ТС] 3
Мне нужно просто объяснить почему 3 раза вызывается, чтобы я понял
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
15.10.2014, 20:22 4
VitekSR, а что я непонятного сказал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int  kvadrat :: Srav(kvadrat Vcompared)//Vcompared нужно чтобы кто-то создал
// каждый раз новый на основе передаваемого в функцию аргумента
{
    if (area == V1.area)
        return 0;
    else
    if (area > V1.area)
    {
        return 1;
    }
    else
        return 2;
}
int main()
{
    kvadrat V,V1(6);
    V.Getx1();
//создаём аргумент Vcompared для функции kvadrat::Srav (конструктор)
    V.Srav(V1);
//разрушаем аргумент Vcompared для функции kvadrat::Srav (деструктор)
 
//и так перед каждым вызовом и после каждого вызова функции Srav или Srav1...
}
1
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2014, 20:22 5
Цитата Сообщение от VitekSR Посмотреть сообщение
У меня же 2 объекта используются V и V1.
Объяви их в main(), вот так, чтобы увидеть, как для них деструктор вызывается:
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
int main()
{
    {
    kvadrat V, V1(6);
    
    setlocale(LC_ALL, "rus");
    cout<<endl<<"Квадрат №"<<V.GetName()<<endl;
    cout<<"x = : "<<V.Getx1()<<endl;
 
    cout<<endl<<"Квадрат №"<<V1.GetName()<<endl;
    cout<<"x = : "<<V1.Getx1()<<endl;
 
    V.Area();
    cout<<endl<<"Площадь квадрата №"<<V.GetName()<<":  "<<V.GetArea();
    V1.Area();
    cout<<endl<<"Площадь квадрата №"<<V1.GetName()<<":  "<<V1.GetArea();
    if(V.Srav(V1)==0)
        cout<<endl<<"Площадь квадратов одинакова.";
    else
        if(V.Srav(V1)==1)
            cout<<endl<<endl<<"Площадь первого квадрата больше второго.";
        else
            if(V.Srav(V1)==2)
                cout<<endl<<endl<<"Площадь второго квадрата больше первого.";
 
    V.Perimetr();
    cout<<endl<<"Периметр квадрата №1"<<": "<<V.GetPerimetr();
    V1.Perimetr();
    cout<<endl<<"Периметр квадрата №2"<<": "<<V1.GetPerimetr();
    if(V.Srav1(V1)==0)
        cout<<endl<<"Периметр квадратов одинаков.";
    else
        if(V.Srav1(V1)==1)
            cout<<endl<<endl<<"Периметр первого квадрата больше второго."<<endl;
        else
            if(V.Srav1(V1)==2)
                cout<<endl<<endl<<"Периметр второго квадрата больше первого."<<endl;
 
 
    }
    system("pause");
    return 0;
}
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
15.10.2014, 20:30  [ТС] 6
Я все равно не понимаю откуда 3ий объект вылазиет. Почему деструктор уничтожает(срабатывает) 3 раза!?!?!?!
Миниатюры
Деструктор уничтожает 3 объекта класса. Почему?  
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
15.10.2014, 20:41 7
VitekSR, вот, держи. Найди все слова конструктор и все слова деструктор. Будут вопросы - задавай.
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
int main()
{
    kvadrat V, V1(6);//конструктор, конструктор
    
    setlocale(LC_ALL, "rus");
    cout<<endl<<"Квадрат №"<<V.GetName()<<endl;
    cout<<"x = : "<<V.Getx1()<<endl;
 
    cout<<endl<<"Квадрат №"<<V1.GetName()<<endl;
    cout<<"x = : "<<V1.Getx1()<<endl;
 
    V.Area();
    cout<<endl<<"Площадь квадрата №"<<V.GetName()<<":  "<<V.GetArea();
    V1.Area();
    cout<<endl<<"Площадь квадрата №"<<V1.GetName()<<":  "<<V1.GetArea();
    if(V.Srav(V1)==0)   //конструктор, деструктор
        cout<<endl<<"Площадь квадратов одинакова.";
    else
        if(V.Srav(V1)==1)////конструктор, деструктор
            cout<<endl<<endl<<"Площадь первого квадрата больше второго.";
        else
            if(V.Srav(V1)==2)//конструктор, деструктор
                cout<<endl<<endl<<"Площадь второго квадрата больше первого.";
 
    V.Perimetr();
    cout<<endl<<"Периметр квадрата №1"<<": "<<V.GetPerimetr();
    V1.Perimetr();
    cout<<endl<<"Периметр квадрата №2"<<": "<<V1.GetPerimetr();
    if(V.Srav1(V1)==0)////конструктор, деструктор
        cout<<endl<<"Периметр квадратов одинаков.";
    else
        if(V.Srav1(V1)==1)////конструктор, деструктор
            cout<<endl<<endl<<"Периметр первого квадрата больше второго."<<endl;
        else
            if(V.Srav1(V1)==2)////конструктор, деструктор
                cout<<endl<<endl<<"Периметр второго квадрата больше первого."<<endl;
 
 
    }
    system("pause");
    return 0;
    //деструктор, деструктор
}
1
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2014, 20:44 8
Цитата Сообщение от VitekSR Посмотреть сообщение
Я все равно не понимаю откуда 3ий объект вылазиет.
Сделай, как в коде в 6 посте, может тогда поймёшь:
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
15.10.2014, 20:49  [ТС] 9
3 объекта уничтожает, потом еще 3. Потом еще 2. Потом после нажатия клавиши еще 2
Почему сначала 3 объекта уничтожает, потом 2?
Миниатюры
Деструктор уничтожает 3 объекта класса. Почему?  
0
3653 / 2990 / 828
Регистрация: 25.03.2012
Сообщений: 11,025
Записей в блоге: 1
15.10.2014, 20:54 10
VitekSR, посмотри мои комментарии
1
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2014, 20:56 11
А лучше так:
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
int main()
{
    {
    kvadrat V, V1(6);
    
    setlocale(LC_ALL, "rus");
    cout<<endl<<"Квадрат №"<<V.GetName()<<endl;
    cout<<"x = : "<<V.Getx1()<<endl;
 
    cout<<endl<<"Квадрат №"<<V1.GetName()<<endl;
    cout<<"x = : "<<V1.Getx1()<<endl;
 
    V.Area();
    cout<<endl<<"Площадь квадрата №"<<V.GetName()<<":  "<<V.GetArea();
    V1.Area();
    cout<<endl<<"Площадь квадрата №"<<V1.GetName()<<":  "<<V1.GetArea();
    int f = V.Srav(V1);
    if(f==0)
        cout<<endl<<"Площадь квадратов одинакова.";
    else
        if(f==1)
            cout<<endl<<endl<<"Площадь первого квадрата больше второго.";
        else
            if(f==2)
                cout<<endl<<endl<<"Площадь второго квадрата больше первого.";
 
    V.Perimetr();
    cout<<endl<<"Периметр квадрата №1"<<": "<<V.GetPerimetr();
    V1.Perimetr();
    cout<<endl<<"Периметр квадрата №2"<<": "<<V1.GetPerimetr();
    f = V.Srav1(V1);
    if(f==0)
        cout<<endl<<"Периметр квадратов одинаков.";
    else
        if(f==1)
            cout<<endl<<endl<<"Периметр первого квадрата больше второго."<<endl;
        else
            if(f==2)
                cout<<endl<<endl<<"Периметр второго квадрата больше первого."<<endl;
 
 
    }
    system("pause");
    return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от VitekSR Посмотреть сообщение
Потом после нажатия клавиши еще 2
Глобальные убери.
Цитата Сообщение от VitekSR Посмотреть сообщение
3 объекта уничтожает, потом еще 3.
Три раза вызывается функция, в неё три раза передаётся копия, при выходе из функции три раза копия уничтожается.
Потом ещё три раза вызывается функция.
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
15.10.2014, 20:58  [ТС] 12
alsav22, в твоем случае удаляет 1 объект. Потом еще 1 объект. Потом 2.
Kuzia domovenok, в твоем случае 3, потом еще 3, потом 2.
И какой более правильный вариант?)

И Kuzia domovenok, я теперь врубился почему столько уничтожает. Но еще ответь на вопрос выше)

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Глобальные убери.
глобальные переменные у меня только V и V1, я не могу же их убрать
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2014, 21:00 13
Цитата Сообщение от VitekSR Посмотреть сообщение
alsav22, в твоем случае удаляет 1 объект. Потом еще 1 объект. Потом 2.
Ты мне это сообщаешь? Я и так знаю.

Добавлено через 1 минуту
Цитата Сообщение от VitekSR Посмотреть сообщение
глобальные переменные у меня только V и V1, я не могу же их убрать
Почему, если они уже в main() объявлены? Вот эти убери:
C++
1
2
3
~kvadrat() //деструктор
    { cout<<endl<<"Объект уничтожен!"; } 
}V,V1(6); // убери эти
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
15.10.2014, 21:00  [ТС] 14
Цитата Сообщение от alsav22 Посмотреть сообщение
Ты мне это сообщаешь? Я и так знаю.
Ну почему в твоем случае 1 потом еще 1 потом 2. А в его 3, 3, 2?
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2014, 21:02 15
Цитата Сообщение от VitekSR Посмотреть сообщение
Ну почему в твоем случае 1 потом еще 1 потом 2. А в его 3, 3, 2?
Потому, что я сделал по одному вызову каждой функции, а у тебя они по три раза вызываются.
А 2 - это уничтожение самих объектов V и V1, объявленных в локальной области ({}) в main().
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
15.10.2014, 21:06  [ТС] 16
т.е что твой вариант, что вариант Kuzia domovenok верны?
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2014, 21:09 17
Цитата Сообщение от VitekSR Посмотреть сообщение
что вариант Kuzia domovenok
Это не его вариант, а твой. Насчёт количества вызовов деструкторов понял что-то?
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
15.10.2014, 21:17  [ТС] 18
Цитата Сообщение от alsav22 Посмотреть сообщение
Насчёт количества вызовов деструкторов понял что-то?
да, "спасибо" поставил.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2014, 21:17
Помогаю со студенческими работами здесь

Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два
Здравствуйте. Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию...

Деструктор объекта
Почему код: #include &lt;iostream&gt; using namespace std; class myclass{ static int i; ...

Не отрабатывает деструктор COM объекта
кто нибудь писал com объекты на C# для 1С? почему com объект созданный на C# не запускает...

Создайте массив типа Employee и сохраните в него 3 объекта класса Employee и 3 объекта класса Manager
Здравствуйте! Задача: Создайте массив типа Employee и сохраните в него 3 объекта класса Employee...


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

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

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