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

Соблюдение норм ООП - C++

Восстановить пароль Регистрация
 
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
14.12.2012, 12:02     Соблюдение норм ООП #1
После прочтения главы книги о классах языка C++ я очень хотел написать программу, в которой их свойства применяются. При написании методов класса я старался как можно дальше абстрагироваться от подробностей их применения, в связи с этим и есть такая фрагментация функции show (), насколько у меня это получилось? Собственно вопрос: что мне нужно подправить, чтобы программа была Ъ-ООП, или же всё и так не плохо?
PS я учусь по направлению прикладная информатика в экономике, потому и не удержался добавить пару плюшек, специфичных для работы с банковскими счетами (история операций) и удаление персональных данных. Насколько у меня это вышло тоже прошу написать.
объявление класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef _BANK_H_
#define _BANK_H_
class Acct {
    private: 
        static const int NAME = 30;
        char name [NAME];
        int number;
        double balance;
        double operations [NAME];
    public:
        Acct ();
        void _fill (const char anyname [], const int & acc, const double & money);
        ~Acct ();
        int operation;
        const void _put (const double & money);
        const void _take (const double & money);
        const void _show_name () const;
        const void _show_number () const;
        const void _show_balance () const;
        const bool _show_actions (int current, bool request = false) const;
    };
#endif
подробная реализация функций
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
#ifndef _CLIENT_FUNCTIONS_H_
#define _CLIENT_FUNCTIONS_H_
#include <iostream>
#include "bank1.h"
using std::cout;
using std::cin;
double money;
void _show (const Acct & client) {
    cout << '\n';
    client._show_name ();
    cout << " has ";
    client._show_balance ();
    cout << " on it's account by number ";
    client._show_number ();
    cout << '\n';
};
void _fill (Acct & client) {
    cout << "\nEnter a name of client: ";
    char name [30];
    cin.get (name, 29);
    cout << "Enter his number (10 digits): ";
    int number;
    while (!(cin >> number) || number <= 999999999) {
        cin.clear ();
        while (cin.get () != '\n')
            continue;
        cout << "Enter a number consisting of 10 digits: ";
    };    
    cout << "Enter his balance: ";
    double balance;
    while (!(cin >> balance)){
        cin.clear ();
        while (cin.get () != '\n')
            continue;
        };
    client._fill (name, number, balance);
};
void _show_actions (const Acct & client) {
    cout << '\n';
    if (client.operation != 0)
       for (int current = 0; current < client.operation; current++) {
           if (client._show_actions (current, true))
               cout << "Adding ";
           else
               cout << "Drawing ";
           client._show_actions (current);
           cout << " provisional units.\n";
            }
    else 
           cout << "There are no any actions on your account.\n";
        }
    void showmenu () {
        cout << "\nEnter I to show information about a client\n"
             << "To put money on the account enter P\n"
             << "To take money from account enter T\n"
             << "To show  recent actions enter A\n"
             << "To exit from this account and to create a new account enter D\n"
             << "To terminate enter Q\n"
             << "Your choice: ";
            };
#endif
методы класса
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
#include <iostream>
#include <cstring>
#include "bank1.h"
using std::cin;
using std::cout;
using std::strncpy;
Acct::Acct () {
    strncpy (name, "Sample Man", 11);
    number = 0;
    balance = 0;
    operation = 0;
    for (int i = 0; i < NAME; i++)
        operations [i] = 0;
};
void Acct::_fill (const char anyname [], const int & acc, const double & money) {
    strncpy (name, anyname, NAME);
    number = acc;
    balance = money;
};
Acct::~Acct () {
    strncpy (name, "Sample man", 11);
    for (int i = 0; i < NAME; i++)
        operations [i] = 0;
    operation = 0;
    number = 0;
    balance = 0.0;
};
const void Acct::_put (const double & money) {
    balance += money;
    operations [operation++] = money;
};
const void Acct::_take (const double & money) {
    balance -= money;
    operations [operation++] = (-1)*money;
};
const void Acct::_show_name () const {
    cout << name;
};
const void Acct::_show_number () const {
    cout << number;
};
const void Acct::_show_balance () const {
    cout << balance;
};
const bool Acct::_show_actions (int current, bool request) const {
    if (request){
        if (operations [current] > 0)
            return true;
        else 
            return false;
        };
    if (operations [current] > 0)
            cout << operations [current] ;
        else if (operations [current] < 0)
            cout << (-1) * operations [current];
};
собственно, программа
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
#include "client_functions1.h"
int main () {
    cout << "At first, enter information about a client. That's an example of filling:\n";
    Acct client;
    _show (client);
    cout << "Now, it's your turn.\n";
    _fill (client);
    cout << "What do you wish to do now? (Q to quite)\n";
    showmenu ();
    char c;
    while (cin >> c && c != 'Q' && c != 'q'){
    switch (c) {
        case 'I':
        case 'i':   _show (client);
                    break;
        case 'P':
        case 'p':   cout << "Enter a sum to put on your account: ";
                    cin >> money;
                    cout << '\n';
                    client._put (money);
                    break;
        case 'T':
        case 't':   cout << "Enter a sum to take from your account: ";
                    cin >> money;
                    cout << '\n';
                    client._take (money);
                    break;
        case 'A':
        case 'a':   _show_actions (client);
                    break;
        case 'D':
        case 'd': client.~Acct ();
                    cin.ignore (1);
                    _fill (client);
                    break;
        default : cout << "That's not a choise";
    };
    showmenu ();
}
    system ("pause");
    return 0;
};
заранее благодарю

Добавлено через 9 минут
while (!(cin >> number) || number <= 999999999)
здесь, оказывается ошибка. Хотел сделать так, чтобы вводилось 10 цифр.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2012, 12:02     Соблюдение норм ООП
Посмотрите здесь:

ООП C++
Кто может порекомендовать норм универсальный парсер сайтов C++
C++ ООП
с++,циклическая очередь, сразу норм выводит, а потом на где-то логика нарушается и неправильно выводит C++
Так, норм задачка, гляньте, скажите что да как C++
код с++. где что поставить что бы прога норм работала? C++
C++ Как сделать в конструкциий switch, чтобы он считал норм float и double
Подправьте код, чтобы норм компилировался, просто у меня старый источник примеров по C++ C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.12.2012, 13:20     Соблюдение норм ООП #2
При беглом взгляде в глаза бросаются три вещи.
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
const void _put (const double & money);
1. const void? Это что за зверь еще? Просто void.
2. Имена, начинающиеся с символа подчеркивания, зарезервированы, не стоит их использовать.
3. Методы show_ всегда выводят в стандартный поток вывода. Если хочется сделать вывод по одному атрибуту, то лучше в метод передавать поток, в который будет осуществляться вывод. Если нужно сериализовать весь объект, то лучше перегрузить оператор<< для него и в нем использовать геттеры для атрибутов.

Цитата Сообщение от tramp_1-3 Посмотреть сообщение
case 'd': client.~Acct ();
Деструктор не нужно вызывать явно.

Upd: нет смысла обнулять поля в деструкторе.
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
14.12.2012, 13:48  [ТС]     Соблюдение норм ООП #3
Цитата Сообщение от 0x10 Посмотреть сообщение
3. Методы show_ всегда выводят в стандартный поток вывода. Если хочется сделать вывод по одному атрибуту, то лучше в метод передавать поток, в который будет осуществляться вывод. Если нужно сериализовать весь объект, то лучше перегрузить оператор<< для него и в нем использовать геттеры для атрибутов.
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
case 'd': client.~Acct ();
Деструктор не нужно вызывать явно.
Первые два пункта предельно понятны, третий пытаюсь вкурить, больно сложно написано =) Спасибо за замечания. Деструктор использовал, так как его призвание очищать ненужную иннформацию, но больше так не буду. Ещё раз спасибо.

Добавлено через 13 минут
Цитата Сообщение от 0x10 Посмотреть сообщение
3. Методы show_ всегда выводят в стандартный поток вывода. Если хочется сделать вывод по одному атрибуту, то лучше в метод передавать поток, в который будет осуществляться вывод. Если нужно сериализовать весь объект, то лучше перегрузить оператор<< для него и в нем использовать геттеры для атрибутов.
Стандартный поток вывода - обыкновенное использование cout? Атрибут - объект класса? Передавать cout << variable как аргумент? Что такое сереализация худо-бедно понял, а как перегрузить << и юзать геттеры пока нет.. Прошу прощенья за шквал тупых вопросов.
Yandex
Объявления
14.12.2012, 13:48     Соблюдение норм ООП
Ответ Создать тему
Опции темы

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