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

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

Войти
Регистрация
Восстановить пароль
 
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
#1

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

14.12.2012, 12:02. Просмотров 312. Ответов 2
Метки нет (Все метки)

После прочтения главы книги о классах языка 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++
Написать программу, которая выполняет действия над матрицами (n x m): нахождение первой и второй норм матриц: просуммировать каждую строку...

Так, норм задачка, гляньте, скажите что да как - C++
Как-то раз Поликарп захотел узнать, кто из секретарей разговаривает по Spyke, а кто — нет. Он выписал для каждого секретаря номер сессии...

Кто может порекомендовать норм универсальный парсер сайтов - C++
Добрый день уважаемые форумчане! По работе очень нужен пасер который мог бы вырезать с различных сайтов мне нужную информацию, инфа в...

Как сделать в конструкциий switch, чтобы он считал норм float и double - C++
Подскажите как сделать в конструкциий switch что бы он считал норм float и doable и возможна как то сделать case 095:

При работе с указателями на сервер отправляется мусор, но выводит в консоль норм данные - C++
День добрый! Отправляю на сервер разные штуки и на снифер это ловлю, вот что получается: char buf = &quot;AAABBB&quot;; на снифере AAABBB -...

Подправьте код, чтобы норм компилировался, просто у меня старый источник примеров по C++ - C++
Подправьте код, чтобы норм компилировался, просто у меня старый источник примеров по C++ #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

код с++. где что поставить что бы прога норм работала? - C++
#include &lt;iostream&gt; #include &lt;string&gt; int main(int argc, char* argv) { struct { const char chr; ...

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

ООП - C++
Подскажите статью или книгу где рассказывается про динамические списки (с указателями,ссылками,динамической памятью и классами знаком)

ООП - C++
помогите пожалуйста лабу сделать. не понимаю чет как ее делать((( я 7 вариант


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
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
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     Соблюдение норм ООП
Ответ Создать тему
Опции темы

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