Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 63

Что-то с конструктором

07.02.2014, 12:35. Показов 788. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: написать программу бюджета, есть два типа счета, у каждого свои параметры пополнения и снятия. Место вывода баланса только что созданного счета: строка el->display(); в конце программы.
Помогите найти ошибку, чтобы правильно выводился баланс счета.

P.S.
Используется связанный список, добавление элементов в конец.
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
#include <iostream>
using namespace std;
 
class Tail
{
public:
    Tail()
    {
        addTail();
    }
    void addTail();
    Tail* next;
};
 
Tail* first = 0;
 
void Tail::addTail()
{
    if (first == 0)
    {
        first = this;
    }
    else
    {
        Tail* temp;
        for (temp = first; temp->next; temp = temp->next){  }
        temp->next = this;
    }
    next = 0;
}
 
class Account : public Tail
{
public:
    Account::Account(unsigned accNo, double balance = 0.0)
    {
        numberAcc = accNo;
        balance = 0.0;
    }
    void deposit(double transaction)
    {
        balance += transaction;
    }
    virtual void operation(double transaction) = 0;
    virtual void withdraw(double transaction) = 0;
    void display()
    {
        cout << balance << endl;
    }
protected:
    double balance;
    unsigned numberAcc;
};
 
class Checking : public Account
{
public:
    Checking::Checking(unsigned accNo, double balance = 0.0) : Account(accNo, balance = 0.0){
        balance = 0.0;  
    }
    virtual void operation(double transaction);
    virtual void withdraw(double transaction);
};
 
class Saving : public Account
{
    public:
    Saving::Saving(unsigned accNo, double balance = 0.0) : Account(accNo, balance = 0.0){balance = 0.0;}
    virtual void withdraw(double transaction);
    virtual void operation(double transaction);
};
 
unsigned total = 0;
 
void Checking::operation(double transaction)
{
    if (balance < 500)
        balance -= 0.2;
    balance += transaction;
}
 
void Checking::withdraw(double transaction)
{
    if (balance < 500)
        balance -= 0.2;
    balance -= transaction;
}
 
void Saving::operation(double transaction)
{
    balance += transaction;
}
 
void Saving::withdraw(double transaction)
{
    total++;
    if (total >= 1)
        balance -= 5.0;
    balance += transaction;
}
 
void process(Account* el)
{
    double transaction;
    do
    {
        cout << "Please enter transaction: ";
        cin >> transaction;
        if (transaction > 0)
            el->operation(transaction);
        else
            el->withdraw(-transaction);
    }while(transaction != 0);
}
 
int getNumber()
{
    unsigned number;
    cout << "Enter number of account: ";
    cin >> number;
    return number;
}
 
int main()
{
    Account* el;
    while(1)
    {
        char type;
        cout << "S = Saving, C = Checking, X = exit" << endl;
        cin >> type;
        if (type == 'X' || type == 'x')
            break;
        switch(type)
        {
        case 'S':
        case 's':
            el = new Saving(getNumber());
            break;
        case 'C':
        case 'c':
            el = new Checking(getNumber());
            break;
        default:
            cout << "I can't understund your symbol. Try again!" << endl;
        }
        el->next = 0;
        process(el);
        el->display(); // <--- вот тут выводим баланс только что введенного счета, но почему-то всегда выводится число -6.27....
    }
    system("pause");
    return 0;
}
Добавлено через 2 минуты
По-моему, что-то с конструктором..
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2014, 12:35
Ответы с готовыми решениями:

Что не так с конструктором
Хотел сделать конструктор что бы передавались туда значения по умолчанию, но пищит ошибку, что не так? Код конструктора: ...

Что не так с конструктором
Здравствуйте не могу понят почему не компилируется, помогите пожалуйста разобраться где ошибка в конструкторе Вот класс: class...

классы непойму что с конструктором
привет вот создал такой класс но чето конструктор ругается но что непойму( #include &lt;iostream&gt; #include &lt;string&gt; ...

10
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
07.02.2014, 13:19
Цитата Сообщение от lotos580 Посмотреть сообщение
Account::Account
нельзя в описании класса так писать, просто Account
0
365 / 321 / 219
Регистрация: 21.02.2013
Сообщений: 756
07.02.2014, 14:46
почему слово virtual повторяется в производных классах checking и savings? убрал virtual и стало работать правильно. dzrkot тоже правильно указал на Account::Account
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
07.02.2014, 17:39
Цитата Сообщение от jurok_85 Посмотреть сообщение
почему слово virtual повторяется в производных классах
может потому что методы виртуальные? а это слово рекомендуется писать, что бы наследуясь от наследника не забыть что у тебя виртуальное
Цитата Сообщение от jurok_85 Посмотреть сообщение
убрал virtual и стало работать правильно
то что Вы убрали никак не повлияло

Добавлено через 3 минуты
lotos580, не ясно зачем Вы передаете в констурктор значение balance котороепо умлочанию 0, и причем в реализации еще раз его зануляете, зачем это вообще тогда в конструкторе

Добавлено через 4 минуты
Цитата Сообщение от lotos580 Посмотреть сообщение
el = new Checking(getNumber());
создаете, но не удаляете

добавьте еще диструкторы и сделайте их виртуальными, иначе не правильно удаление будет производиться
1
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 63
07.02.2014, 20:19  [ТС]
Цитата Сообщение от dzrkot Посмотреть сообщение
нельзя в описании класса так писать, просто Account
Да? Стефан Дэвис так не считает .

Цитата Сообщение от aLarman Посмотреть сообщение
lotos580, не ясно зачем Вы передаете в констурктор значение balance котороепо умлочанию 0, и причем в реализации еще раз его зануляете, зачем это вообще тогда в конструкторе
Это в процессе поиска ошибки было сделано, забыл убрать, но, как видно, ничего не изменилось.

По поводу деструктора в курсе, давайте лучше искать варианты по поводу решения этой ошибки, меня это сейчас больше волнует...

Добавлено через 18 минут
Нашел ошибку, в строках 35, 58 и им подобным нельзя принимать аргумент, который ссылается на член класса (в данном случае balance), изменил название на initBalance и все заработало.
Странно, что никто этого не заметил...
Все равно спасибо всем высказавшимся.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
07.02.2014, 22:19
Цитата Сообщение от lotos580 Посмотреть сообщение
Да? Стефан Дэвис так не считает
а мой компилятор так считает)
...а зачем в аккаунт передаётся balance, он у вас ниначто не влияет в такой постановке
0
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 63
07.02.2014, 22:24  [ТС]
Разве произойдет инициализация баланса у checking или saving не заходя в конструктор account? Думаю, что нет.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2014, 22:36
отгадайте, что делает такой код:
C++
1
2
3
4
5
6
7
8
/////////////////
Checking::Checking(unsigned theAccNo, double theBalance = 0.0) : Account(theAccNo, theBalance = 0.0){
....
 
/////////////////////////
 
//в мэйне:
Checking c(2., 2.);
0
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 63
08.02.2014, 11:28  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
отгадайте, что делает такой код:
Вызывается конструктор cheking, где происходит выполнение тела конструктора (если оно есть), далее передается theAccNo, theBalance в конструктор account, логично же
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
08.02.2014, 12:59
из-за наличия Account(theAccNo, theBalance = 0.0) в списке инициализации (theBalance = 0.0) - в аккаунт вторым аргументом всегда будет передаваться ноль вне зависимости от значения второго арrумента, который был передан в Checking (в моем случае - хотели двойку. а проинициализировали нулем)
0
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 63
08.02.2014, 18:34  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
из-за наличия Account(theAccNo, theBalance = 0.0) в списке инициализации (theBalance = 0.0) - в аккаунт вторым аргументом всегда будет передаваться ноль вне зависимости от значения второго арrумента, который был передан в Checking (в моем случае - хотели двойку. а проинициализировали нулем)
Ну на то он и баланс, чтобы обнулиться при создании счета.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2014, 18:34
Помогаю со студенческими работами здесь

что не так с конструктором с параметрами
создаю экземпляры класса , один через конструктор с параметрами но указываю параметрами он мне пишет ошибка что преобразования типов не...

Не компилируется: что не так с конструктором структуры?
Есть некий класс - односвязный линейный список, с элементами типа TElem. Шаблонность здесь только чтобы хранить различные объекты в списке...

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

Трабла с конструктором
Компилятор никаких ошибок не выдает, но программа не запускается. using namespace std; class Cpmv { public: struct Info ...

Ошибка с конструктором
Добрый день, такая проблема, создал класс, сделал прототип конструктора, перешел в другой файл уже .cpp для реализации конструктора , и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru