Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
lotos580
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 59
07.02.2014, 12:35     Что-то с конструктором #1
Задача: написать программу бюджета, есть два типа счета, у каждого свои параметры пополнения и снятия. Место вывода баланса только что созданного счета: строка 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 минуты
По-моему, что-то с конструктором..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
07.02.2014, 13:19     Что-то с конструктором #2
Цитата Сообщение от lotos580 Посмотреть сообщение
Account::Account
нельзя в описании класса так писать, просто Account
jurok_85
226 / 209 / 70
Регистрация: 21.02.2013
Сообщений: 494
07.02.2014, 14:46     Что-то с конструктором #3
почему слово virtual повторяется в производных классах checking и savings? убрал virtual и стало работать правильно. dzrkot тоже правильно указал на Account::Account
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
07.02.2014, 17:39     Что-то с конструктором #4
Цитата Сообщение от jurok_85 Посмотреть сообщение
почему слово virtual повторяется в производных классах
может потому что методы виртуальные? а это слово рекомендуется писать, что бы наследуясь от наследника не забыть что у тебя виртуальное
Цитата Сообщение от jurok_85 Посмотреть сообщение
убрал virtual и стало работать правильно
то что Вы убрали никак не повлияло

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

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

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

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

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

Добавлено через 18 минут
Нашел ошибку, в строках 35, 58 и им подобным нельзя принимать аргумент, который ссылается на член класса (в данном случае balance), изменил название на initBalance и все заработало.
Странно, что никто этого не заметил...
Все равно спасибо всем высказавшимся.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
07.02.2014, 22:19     Что-то с конструктором #6
Цитата Сообщение от lotos580 Посмотреть сообщение
Да? Стефан Дэвис так не считает
а мой компилятор так считает)
...а зачем в аккаунт передаётся balance, он у вас ниначто не влияет в такой постановке
lotos580
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 59
07.02.2014, 22:24  [ТС]     Что-то с конструктором #7
Разве произойдет инициализация баланса у checking или saving не заходя в конструктор account? Думаю, что нет.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2014, 22:36     Что-то с конструктором #8
отгадайте, что делает такой код:
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.);
lotos580
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 59
08.02.2014, 11:28  [ТС]     Что-то с конструктором #9
Цитата Сообщение от DU Посмотреть сообщение
отгадайте, что делает такой код:
Вызывается конструктор cheking, где происходит выполнение тела конструктора (если оно есть), далее передается theAccNo, theBalance в конструктор account, логично же
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.02.2014, 12:59     Что-то с конструктором #10
из-за наличия Account(theAccNo, theBalance = 0.0) в списке инициализации (theBalance = 0.0) - в аккаунт вторым аргументом всегда будет передаваться ноль вне зависимости от значения второго арrумента, который был передан в Checking (в моем случае - хотели двойку. а проинициализировали нулем)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 18:34     Что-то с конструктором
Еще ссылки по теме:

C++ Работа с конструктором
C++ что не так с конструктором с параметрами
C++ Трабла с конструктором

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

Или воспользуйтесь поиском по форуму:
lotos580
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 59
08.02.2014, 18:34  [ТС]     Что-то с конструктором #11
Цитата Сообщение от DU Посмотреть сообщение
из-за наличия Account(theAccNo, theBalance = 0.0) в списке инициализации (theBalance = 0.0) - в аккаунт вторым аргументом всегда будет передаваться ноль вне зависимости от значения второго арrумента, который был передан в Checking (в моем случае - хотели двойку. а проинициализировали нулем)
Ну на то он и баланс, чтобы обнулиться при создании счета.
Yandex
Объявления
08.02.2014, 18:34     Что-то с конструктором
Ответ Создать тему
Опции темы

Текущее время: 23:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru