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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lotos580
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 60
#1

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

07.02.2014, 12:35. Просмотров 438. Ответов 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 минуты
По-моему, что-то с конструктором..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2014, 12:35     Что-то с конструктором
Посмотрите здесь:

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

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

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

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

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

Проблема с конструктором. - C++
Пытаюсь сделать класс список и не получается написать конструктор копирования. header // #include &lt;iostream&gt;; using namespace std; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
07.02.2014, 13:19     Что-то с конструктором #2
Цитата Сообщение от lotos580 Посмотреть сообщение
Account::Account
нельзя в описании класса так писать, просто Account
jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 518
Завершенные тесты: 1
07.02.2014, 14:46     Что-то с конструктором #3
почему слово virtual повторяется в производных классах checking и savings? убрал virtual и стало работать правильно. dzrkot тоже правильно указал на Account::Account
aLarman
642 / 563 / 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
Сообщений: 60
07.02.2014, 20:19  [ТС]     Что-то с конструктором #5
Цитата Сообщение от dzrkot Посмотреть сообщение
нельзя в описании класса так писать, просто Account
Да? Стефан Дэвис так не считает .

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

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

Добавлено через 18 минут
Нашел ошибку, в строках 35, 58 и им подобным нельзя принимать аргумент, который ссылается на член класса (в данном случае balance), изменил название на initBalance и все заработало.
Странно, что никто этого не заметил...
Все равно спасибо всем высказавшимся.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
07.02.2014, 22:19     Что-то с конструктором #6
Цитата Сообщение от lotos580 Посмотреть сообщение
Да? Стефан Дэвис так не считает
а мой компилятор так считает)
...а зачем в аккаунт передаётся balance, он у вас ниначто не влияет в такой постановке
lotos580
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 60
07.02.2014, 22:24  [ТС]     Что-то с конструктором #7
Разве произойдет инициализация баланса у checking или saving не заходя в конструктор account? Думаю, что нет.
DU
1482 / 1058 / 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
Сообщений: 60
08.02.2014, 11:28  [ТС]     Что-то с конструктором #9
Цитата Сообщение от DU Посмотреть сообщение
отгадайте, что делает такой код:
Вызывается конструктор cheking, где происходит выполнение тела конструктора (если оно есть), далее передается theAccNo, theBalance в конструктор account, логично же
DU
1482 / 1058 / 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++
Доброго времени суток. Обращаюсь к вам с двумя проблемами. Во-первых, Code Blocks выдаёт у меня ошибку multiple definition. Связано ли...

Работа с конструктором - C++
Всем доброго времени суток. Получил задание по программированию в универе. Писать задание за меня не прошу, нужно лишь уяснить парочку...

Ошибки с конструктором по умолчанию - C++
Пишу консольную игру, что-то вроде острова сокровищ, но не могу исправить пару ошибок с конструктором по умолчанию(error C2512) =( кто...

Ввод данных с конструктором - C++
Всем привет, новичок в с++ и возникла проблема. Вот рабочий код: #include &lt;iostream&gt; using namespace std; class Student { ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru