Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
1

4 раза в памяти создается объект класса

28.02.2014, 12:00. Показов 935. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Есть следующий код:
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
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class account
{
private:
    double balanse;
public:
    account();
    void credit(double);
    void debit(double);
    void setBalanse(double);
    double getBalanse();
    ~account();
};
account::account()
{   double bl;
    cout<<"Vvedite nachalnoe znachenie tekushego scheta."<<endl;
    cin>>bl;
    setBalanse(bl);
    if(balanse<0)
{
    balanse=0;
    cout<<"Nachalniy balans nedeystvitelen, prisvoenno znachenie 0 po umolchaniyu"<<endl;
}
}
void account::setBalanse( double bal)
{
    balanse=bal;
}
double account::getBalanse()
{
    cout.precision(2);
    cout<<balanse<<endl;
    return 0;
}
void account::credit(double ad)
{
if(ad<0)
{
    cout<<"Oshibka vvoda"<<endl;
    return;
}
else
balanse=balanse+ad;
}
void account::debit(double da)
{
    if(da<0)
{
    cout<<"Oshibka vvoda"<<endl;
    return;
}
    else
    {
    if(da>balanse) 
    {
    cout<<"Zaprashivaemae summa debeta slihkom velika"<<endl;
    }
    else
        balanse=balanse-da;
    }
}
account::~account()
{
cout<<"Zavershenie raboti"<<endl;
}
void vibor(account &p)
{
int c;
cout<<"Viberite deystvie:"<<endl;
cout<<"1-prosmotr tekushego scheta"<<endl;
cout<<"2-credit"<<endl;
cout<<"3-debit"<<endl;
cout<<"4-exit"<<endl;
cin>>c;
switch(c)
{
case 1:
    p.getBalanse();
    vibor(p);
    break;
case 2:
    double d;
    cout<<"Vvedite summu credita: ";
    cin>>d;
    cout<<endl;
    p.credit(d);
    vibor(p);
    break;
case 3:
    double dd;
    cout<<"Vvedigte summu debeta: ";
    cin>>dd;
    cout<<endl;
    p.debit(dd);
    vibor(p);
    break;
case 4:
    //delete(&p);
    system("exit");
    break;
default:
    cout<<"Oshibka vvoda!"<<endl;
    vibor(p);
    break;
}
}
void main()
{
account one;
vibor(one);
system("pause");
}
В функции vibor при обращении функции к самой себе в памяти создаются объекты класса, то есть при завершении программы деструктор вызывается 4 раза.
Как поправить функция для того, чтобы этого не происходило?
Заранее спасибо за ответы!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2014, 12:00
Ответы с готовыми решениями:

Не создается объект класса
Почему я не могу создать объект класса Zamovlena? Могу создать только указатель. Zamovlena.h...

Не создается объект класса
Только изучаю плюсы. Натолкнулся на непонятное поведение конструктора. Попробовал 2 варианта: ...

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

Создается объект абстрактного класса:(
Вот допустим у меня есть класс: class Cell { public: Cell() {} ~Cell() {} virtual...

16
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 12:21 2
странно, у меня нечего не происходит, а как Вы поняли что объекты создаются?, раз создаются значит срабатывае конструктор по умолчанию, и он предлагает ввести начальную сумму, это происходит?
0
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
28.02.2014, 12:59  [ТС] 3
Цитата Сообщение от aLarman Посмотреть сообщение
странно, у меня нечего не происходит, а как Вы поняли что объекты создаются?, раз создаются значит срабатывае конструктор по умолчанию, и он предлагает ввести начальную сумму, это происходит?
Да.
По очереди попробуйте вызвать все 3 функции, а затем завершите программу вводов "4" в выборе.

Добавлено через 34 минуты
Актуально.
0
120 / 120 / 47
Регистрация: 29.03.2013
Сообщений: 237
28.02.2014, 13:16 4
Цитата Сообщение от Talkoflights Посмотреть сообщение
По очереди попробуйте вызвать все 3 функции, а затем завершите программу вводов "4" в выборе.
Вызвался один деструктор, как и, по идее, должно быть. Объект ведь у вас в функцию передаётся по ссылке
0
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
28.02.2014, 13:17  [ТС] 5
Дополнение-при завершении программы должно как бы отображаться сообщение, генерируемое в деструкторе-Zavershenie raboti.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 13:19 6
Talkoflights, а какой компиль?
0
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
28.02.2014, 13:22  [ТС] 7
Цитата Сообщение от scenotaph Посмотреть сообщение
Вызвался один деструктор, как и, по идее, должно быть. Объект ведь у вас в функцию передаётся по ссылке
У меня в данном случае деструктор вообще не вызывается.

Добавлено через 2 минуты
Цитата Сообщение от aLarman Посмотреть сообщение
Talkoflights, а какой компиль?
VS 2010
0
120 / 120 / 47
Регистрация: 29.03.2013
Сообщений: 237
28.02.2014, 13:22 8
Talkoflights, Вызывается:
C++
1
2
3
4
5
account::~account()
{
cout<<"Zavershenie raboti"<<endl;
system("pause");
}
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 13:22 9
Talkoflights, он вызывается, после press any key to continue... после нажатия любой клавиши, проскакивает сообщение деструктора
0
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
28.02.2014, 13:23  [ТС] 10
Цитата Сообщение от scenotaph Посмотреть сообщение
Talkoflights, Вызывается:
Вы не так поняли. Он ДОЛЖЕН(по идее) вызываться, но при выполнении этого не происходит. То есть что-то происходит некорректно.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 13:24 11
Цитата Сообщение от Talkoflights Посмотреть сообщение
Он ДОЛЖЕН(по идее) вызываться
да вызывается он блин, когда у Вас объект разрушается? после выхода из мейна, сообщение проскакиевает мгновенно, его можно не заметить
0
120 / 120 / 47
Регистрация: 29.03.2013
Сообщений: 237
28.02.2014, 13:25 12
Talkoflights, Да вызывается он, после нажатия кнопки 4.
Убедитесь, поставив точку останова там или, как я написал, какой-нибудь system("pause");
0
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
28.02.2014, 13:28  [ТС] 13
Черт, там же была пауза! Аргх!
Спасибо, извиняюсь за беспокойство.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 13:30 14
Talkoflights, пробелма с созданием лишним созданием объекта еще не решена?
0
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
28.02.2014, 13:33  [ТС] 15
Цитата Сообщение от aLarman Посмотреть сообщение
Talkoflights, пробелма с созданием лишним созданием объекта еще не решена?
Конечно решена. Я же передаю в функцию по адресу, они и не генерируются.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 13:42 16
Цитата Сообщение от Talkoflights Посмотреть сообщение
Я же передаю в функцию по адресу, они и не генерируются.
а изначально было не так? в смысле по адресу? Вы имеете ввиду ссылку?
0
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
28.02.2014, 14:11  [ТС] 17
Цитата Сообщение от aLarman Посмотреть сообщение
а изначально было не так? в смысле по адресу? Вы имеете ввиду ссылку?
Указатель.
0
28.02.2014, 14:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2014, 14:11
Помогаю со студенческими работами здесь

Почему не создается второй объект класса?
#include &lt;string&gt; // Заголовочный файл students.h class students { public:...

Зачем для указателя на объект класса создается отдельный класс
Читаю книгу Джефа Элджера &quot;Библиотека программиста С++&quot;, там в главе про умные указатели приводится...

Как передавать объект класса в методе main, чтобы конструктор не вызывался 2 раза?
Проблемы заключаются в следующем: есть класс для создания записи и класс для хранения массива этих...

Объект класса в динамической памяти
Привет. Вот листинг: #include &lt;iostream&gt; using namespace std; class SimpleCat { public:...


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

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