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

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

07.02.2014, 12:35. Показов 777. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru