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

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

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

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

07.02.2014, 12:35. Просмотров 441. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
создаю экземпляры класса , один через конструктор с параметрами но указываю параметрами он мне пишет ошибка что преобразования типов не...

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

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

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

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

10
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
07.02.2014, 13:19 #2
Цитата Сообщение от lotos580 Посмотреть сообщение
Account::Account
нельзя в описании класса так писать, просто Account
0
jurok_85
241 / 225 / 78
Регистрация: 21.02.2013
Сообщений: 520
Завершенные тесты: 1
07.02.2014, 14:46 #3
почему слово virtual повторяется в производных классах checking и savings? убрал virtual и стало работать правильно. dzrkot тоже правильно указал на Account::Account
0
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());
создаете, но не удаляете

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

Работа с конструктором - C++
Доброго времени суток. Обращаюсь к вам с двумя проблемами. Во-первых, Code Blocks выдаёт у меня ошибку multiple definition. Связано ли...

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

Присваивание конструктором копирования - C++
Всем форумчанам привет. Я совсем недавно изучаю с++. Помогите плиз понять. К примеру вот такой код: #include &lt;iostream.h&gt; int...

Шаблон с конструктором копирования - C++
Найдите периметр и площадь выпуклого многоугольника. Распределение памяти для хранения массивов должно осуществляться динамически(в...


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
08.02.2014, 18:34
Ответ Создать тему
Опции темы

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