Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114

Прошу оценить стиль программы

14.02.2019, 17:16. Показов 4667. Ответов 73

Студворк — интернет-сервис помощи студентам
Всем мира!
Ребят, в общем наваял я тут чудо-чудное, диво-дивное (мне так кажется)
Прошу, чтоб посмотрели код, посоветовали, что можно исправить, что добавить, как короче можно написать, как логичней ну и т.д. В общем взглянуть на программу сторонними разбирающимися глазами

Программа реализует Зоомагазин, который периодически на просторах киберфорума встречается. Присутствуют функции добавления, редактирования, удаления, отображения БД(если это можно так назвать (да простит меня Нео)...), а также записи всего этого добра в файл и чтение из него.

Я не студент, это не моя курсовая, экзамен и т.д. Я не оказываю кому-либо медвежью или финансовую услугу. Я самоучка стремящийся к Зеленому Бегущему Свету

Сначала я кину .h, затем .cpp

Если нужно кину на почту .zip с проектом (среда VS 2017)!

Спасибо!

pch.h - основной заголовок.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef PCH_H
#define PCH_H
#include <iostream>
#include <fstream>
#include <ios>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <conio.h>
#include <windows.h>
int menu();
#endif
Class.h - заголовок класса petshopБ в котором реализуются все звери
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
#pragma once
#include <fstream>
 
class petshop {
    char animal[20];
    char name[20];
    char gender[7];
    int cost;
    int count;
public:
    petshop();
    petshop(const petshop &ob);
    void set_name();
    void set_animal();
    void set_gender();
    void set_cost();
    void set_count();
    void show_sample();
    char *get_animal();
    char *get_name();
    char *get_gender();
    int *get_cost();
    int *get_count();
    petshop operator=(petshop ob);
    friend std::ostream &operator<<(std::ostream &stream, const petshop ob);
    friend std::istream &operator>>(std::istream &stream, petshop &ob);
    ~petshop();
};
draw.h - заголовок функции раскраски активной строки меню
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
#pragma once
#include "Class.h"
enum ConsoleColor
{
    Black = 0,
    Blue = 1,
    Green = 2,
    Cyan = 3,
    Red = 4,
    Magenta = 5,
    Brown = 6,
    LightGray = 7,
    DarkGray = 8,
    LightBlue = 9,
    LightGreen = 10,
    LightCyan = 11,
    LightRed = 12,
    LightMagenta = 13,
    Yellow = 14,
    White = 15
};
 
void draw(const char str[15]);
void draw(petshop ob);
update.h - заголовок функционала редактирования зверей в магазине
C++
1
2
3
4
5
6
7
8
9
#include "Class.h"
#include <vector>
 
#ifndef UPDATE
#define UPDATE
int menu_update();
int choose_animal(std::vector<petshop> &v);
void update_animal(std::vector <petshop> &v);
#endif
remove.h - заголовок функционала удаления зверей
C++
1
2
3
4
5
6
7
8
#include "Class.h"
#include <vector>
 
#ifndef REMOVE
#define REMOVE
void remove_animal(std::vector<petshop> &v);
int choose_animal2(std::vector<petshop> &v);
#endif
write_file.h - заголовок функции записи БД в файл
C++
1
2
3
4
#pragma once
#include "Class.h"
#include <vector>
void write_to_file (std::vector<petshop> &v);
read_file.h - заголовок функции чтения данных из файла и переноса данных в БД
C++
1
2
3
4
#pragma once
#include "Class.h"
#include <vector>
void read_from_file(std::vector<petshop> &v);





main.cpp - Главная функция
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
#include "pch.h"
#include "draw.h"
#include "Class.h"
#include "update.h"
#include "remove.h"
#include "write_file.h"
#include "read_file.h"
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
 
int main()
{
    int answer;
    char r1[20];
    vector <petshop> v;
    v.reserve(1000);
    petshop *s;
    int i;
 
    for (;;) {
        answer = menu();
        switch (answer)
        {
        case 0: {
            s = new petshop;
            s->set_animal();
            s->set_name();
            s->set_gender();
            s->set_cost();
            s->set_count();
            v.emplace_back(*s);
            delete s;
            break;
        }
        case 1: {
            for (i = 0; i < v.size(); i++) {
                v[i].show_sample();
            }
            cin.get();
            break;
        }
        case 2: {
            update_animal(v);
            break;
        }
        case 3: {
            remove_animal(v);
            break;
        }
        case 4: {
            write_to_file(v);
            break;
        }
        case 5: {
            read_from_file(v);
            break;
        }
        case 6: {
            return 0;
        }
        }
    }
}
    
int menu()
    {
    static int key = 0;
    int code;
    do {
        system("cls");
        if (key == 0) draw("Add animal");
        else cout << "Add animal\n";
        if (key == 1) draw("Display");
        else cout << "Display\n";
        if (key == 2) draw("Update animal");
        else cout << "Update animal\n";
        if (key == 3) draw("Remove animal");
        else cout << "Remove animal\n";
        if (key == 4) draw("Write to file");
        else cout << "Write to file\n";
        if (key == 5) draw("Read file");
        else cout << "Read file\n";
        if (key == 6) draw("Close program");
        else cout << "Close program\n";
        cout << endl;
            if (key == key)
        {
            code = getch();
            if (code == 80) {
                key++;
                if (key == 7) key = 0;
            }
            if (code == 72) {
                key--;
                if (key == -1) key = 6;
            }
        }
    } while (code != 13);
    return key;
}
class.cpp - описание класса
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
#include "pch.h"
#include "Class.h"
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
 
petshop::petshop()
{
    strcpy(animal, "");
    strcpy(name, "");
    strcpy(gender, "");
    cost = 0;
    count = 0;
}
 
petshop::petshop(const petshop &ob)
{
    strcpy(this->animal, ob.animal);
    strcpy(this->name, ob.name);
    strcpy(this->gender, ob.gender);
    cost = ob.cost;
    count = ob.count;
}
 
void petshop::set_animal() {
    char r1[20];
    cout << "What kind of animal you want to write?\n";
    cin >> r1;
    strcpy(animal, r1);
}
 
void petshop::set_name() {
    char r1[20];
    cout << "What name you want to write?\n";
    cin >> r1;
    strcpy(name, r1);
}
 
void petshop::set_gender() {
    char r1[20];
    cout << "What gender do the animal have?\n";
    cin >> r1;
    strcpy(gender, r1);
}
 
void petshop::set_cost() {
    int a;
    cout << "What is the cost of the animal?\n";
    cin >> a;
    cost = a;
}
 
void petshop::set_count() {
    int a;
    cout << "How many animals of that type?";
    cin >> a;
    count = a;
}
 
void petshop::show_sample()
{
    cout << "Animal: " << this->animal << '\n';
    cout << "Name: " << this->name << '\n';
    cout << "Gender: " << this->gender << '\n';
    cout << "Cost: " << this->cost << '$' << '\n';
    cout << "Count: " << this->count << '\n';
}
 
char *petshop::get_animal() 
{
    return animal; 
}
 
char *petshop::get_name()
{
    return name;
}
 
char *petshop::get_gender()
{
    return gender;
}
 
int *petshop::get_cost()
{
    return &cost;
}
 
int *petshop::get_count()
{
    return &count;
}
 
petshop::~petshop()
{
}
 
 
petshop petshop::operator=(petshop ob)
{
    strcpy(this->animal, ob.animal);
    strcpy(this->name, ob.name);
    strcpy(this->gender, ob.gender);
    cost = ob.cost;
    count = ob.count;
    return *this;
}
 
ostream &operator<<(ostream &stream, petshop obj) 
{
    stream << obj.animal << '\n';
    stream << obj.name << '\n';
    stream << obj.gender << '\n';
    stream << obj.cost << '\n';
    stream << obj.count << "\n\n";
 
    return stream;
}
 
istream &operator>>(istream &stream, petshop &obj)
{
    stream >> obj.animal;
    stream >> obj.name;
    stream >> obj.gender;
    stream >> obj.cost;
    stream >> obj.count;
 
    return stream;
}
draw.cpp - описание раскраски активной строки меню
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "pch.h"
#include "draw.h"
#include "Class.h"
#include <windows.h>
#include <iostream>
using namespace std;
 
void draw(const char str[15])
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightMagenta));
    cout << str << '\n';
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightGray));
}
 
void draw(petshop ob)
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightMagenta));
    ob.show_sample();
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightGray));
}
update.cpp - описание редактирования зверей в БД
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
#include "pch.h"
#include "update.h"
#include "draw.h"
#include "Class.h"
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
void update_animal(vector<petshop> &v)
{
    int i;
    if (v.empty()) {
        cout << "There is no animals in database...";
        cin.get();
        return;
    }
    int choose;
    choose = choose_animal(v);
    if (choose == v.size()) return;
    int answer2;
    for (;;) {
        answer2 = menu_update();
        switch(answer2)
        {
        case 0: 
        {
            v[choose].set_animal();
            cout << "Type successfully changed!";
            break;
        }
        case 1: 
        {
            v[choose].set_name();
            cout << "Name successfully changed!";
            break;
        }
        case 2:
        {
            v[choose].set_gender();
            cout << "Gender successfully changed!";
            break;
        }
        case 3:
        {
            v[choose].set_cost();
            cout << "Type successfully changed!";
            break;
        }
        case 4:
        {
            v[choose].set_count();
            cout << "Count successfully changed!";
            break;
        }
        case 5:
        {
            return;
        }
        }
    }
 
}
 
int menu_update()
{
    static int key2 = 0;
    int code2;
    do {
        system("cls");
        if (key2 == 0) draw("Animal type");
        else cout << "Animal type\n";
        if (key2 == 1) draw("Animal name");
        else cout << "Animal name\n";
        if (key2 == 2) draw("Animal gender");
        else cout << "Animal gender\n";
        if (key2 == 3) draw("Animal cost");
        else cout << "Animal cost\n";
        if (key2 == 4) draw("Animal count");
        else cout << "Animal count\n";
        if (key2 == 5) draw("Back to Main menu");
        else cout << "Back to Main menu\n";
        cout << endl;
 
        if (key2 == key2)
        {
            code2 = getch();
            if (code2 == 80) {
                key2++;
                if (key2 == 6) key2 = 0;
            }
            if (code2 == 72) {
                key2--;
                if (key2 == -1) key2 = 5;
            }
        }
    } while (code2 != 13);
    return key2;
}
 
int choose_animal(vector<petshop> &v)
{
    int i;
    static int key3 = 0;
    int code3;
    do {
        system("cls");
        for (i = 0; i < v.size(); i++) {
            if (key3 == i) draw(v[i]);
            else v[i].show_sample();
        }
        if (key3 == v.size()) draw("Back to Main menu");
        else cout << "Back to Main menu\n";
        cout << endl;
 
        if (key3 == key3)
        {
            code3 = getch();
            if (code3 == 80) {
                key3++;
                if (key3 == v.size()+1) key3 = 0;
            }
            if (code3 == 72) {
                key3--;
                if (key3 == -1) key3 = v.size();
            }
        }
    } while (code3 != 13);
    return key3;
}
remove.cpp - описание удаления зверей из БД
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
#include "pch.h"
#include "draw.h"
#include "Class.h"
#include "remove.h"
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
void remove_animal(vector<petshop> &v)
{
    int i;
    if (v.empty()) {
        cout << "There is no animals in database...";
        cin.get();
        return;
    }
    int choose2;
    choose2 = choose_animal2(v);
    if (choose2 == v.size()) return;
    v.erase(v.begin()+choose2);
}
 
int choose_animal2(vector<petshop> &v)
{
    int i;
    static int key3 = 0;
    int code3;
    do {
        system("cls");
        for (i = 0; i < v.size(); i++) {
            if (key3 == i) draw(v[i]);
            else v[i].show_sample();
        }
        if (key3 == v.size()) draw("Back to Main menu");
        else cout << "Back to Main menu\n";
        cout << endl;
 
        if (key3 == key3)
        {
            code3 = getch();
            if (code3 == 80) {
                key3++;
                if (key3 == v.size() + 1) key3 = 0;
            }
            if (code3 == 72) {
                key3--;
                if (key3 == -1) key3 = v.size();
            }
        }
    } while (code3 != 13);
    return key3;
}
write_file.cpp - описание записи БД в файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "pch.h"
#include "write_file.h"
#include <fstream>
#include <iostream>
 
using namespace std;
 
void write_to_file(std::vector<petshop> &v)
{
    ofstream tofile("animals.bin", ios::trunc | ios::binary);
    int i;
    if (!tofile.is_open()) {
        cout << "File is not found!";
        return;
    }
 
    for (i = 0; i < v.size(); i++) {
        tofile << v[i];
    }
 
    tofile.close();
}
read_file.cpp - описание чтения данных из файла и переноса в БД
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
#include "pch.h"
#include "read_file.h"
#include <fstream>
#include <iostream>
 
using namespace std;
 
void read_from_file(std::vector<petshop> &v)
{
    ifstream fromfile("animals.bin", ios::binary | ios::out);
    int i;
    if (!fromfile.is_open()) {
        cout << "File is not found!";
        return;
    }
    petshop *s = new petshop;
 
    while (!fromfile.eof()) {
        fromfile >> s->get_animal();
        fromfile >> s->get_name();
        fromfile >> s->get_gender();
        fromfile >> *s->get_cost();
        fromfile >> *s->get_count();
        v.emplace_back(*s);
    }
    fromfile.close();
}

Такая вот программка. Жду отзывов и критики!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2019, 17:16
Ответы с готовыми решениями:

Прошу оценить код на C++
Сильно не пинайте, только начал изучать C++, написал вот такое кот. Что не так в этом коде? Перечислите, какие есть недостатки. Предложите...

Прошу оценить свой уровень
Код во вложениях

Калькулятор для начинающих, прошу оценить
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int menu (); int sum (); int razn (); int vozved (); int delen...

73
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 12:50  [ТС]
Студворк — интернет-сервис помощи студентам
Azazel-San
Я скорее о целях этого проекта вы хотели пощупать ООП?
Ну да. Смысл заниматься и учиться с++, если не реализовывать его главную догму. Хочется на самом деле себя в реальном проекте попробовать. Правда я даже не знаю, какой проект можно вообще выполнить на с++ )))
0
15.02.2019, 12:51

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Может, все же, венгерская нотация? :D
hungarian notation :D
Извиняюсь, русский не мой родной язык)

0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 12:52
Цитата Сообщение от Azazel-San Посмотреть сообщение
это тема холиваров
чувствуется XLAT, хочет поспорить, накипело что то где то видать.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.02.2019, 12:54
Цитата Сообщение от Руслан92 Посмотреть сообщение
Ну да.
Тогда в вашем проекте вы почти ничего, если смотреть со стороны концептов ООП, такого не сделали.

Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
чувствуется XLAT, хочет поспорить, накипело что то где то видать.
Если люди что пишут так:
C++
1
2
{ int a;
}
Я еле сдерживаюсь, но кто я такой что бы судить..
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 12:54  [ТС]

Azazel-San
Тогда в вашем проекте вы почти ничего, если смотреть со стороны концептов ООП, такого не сделали.
А как это в общем должно выглядеть? Реализация деталей - дело второе. Как концептуально эту программу можно исправить (перенести на ООП)?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 12:56
нужно сваливать с темы, нервы дороже
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.02.2019, 12:57
Цитата Сообщение от Руслан92 Посмотреть сообщение
Как концептуально эту программу можно исправить (перенести на ООП)?
Исходя из задачи, ООП - не панацея, использовать его надо как и любой инструмент - по уму, раз он у нас уже есть)
Если хотите практики по ООП, ищите задачу где это можно красиво и просто применить, где нужны наследование, полиморфизм, абстракции, еще есть 5 принципов SOLID - это уже более к проектированию, воот.
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 13:00  [ТС]
_stanislav , думаешь? Может ты и прав Я просто хочу узнать концепцию и можно тему закрывать. Не хочу тратить время на, бессмысленные с точки зрения грамотного продакшна и профессионального кода, программки. Если уж что-то делать в жизни, то делать это хорошо и профессионально. Плохо - оно само получится. А для хорошо нужно усилия прикладывать.
Я решил, что хочу быть программистом, а если решил, то хочу быть не просто абы каким программистом, а по-крайней мере, профессиональным, и главное, понимающим свое дело.

По сути только для этого я сюда программу то и выложил)
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 13:05
Цитата Сообщение от Руслан92 Посмотреть сообщение
Не хочу тратить время на, бессмысленные с точки зрения грамотного продакшна и профессионального кода, программки.
читай про grasp и gof

Добавлено через 2 минуты
и вообще как мне думается, инженерные принципы везде одни, в любой сфере.
1
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
15.02.2019, 13:08
Цитата Сообщение от _stanislav Посмотреть сообщение
нормальный сетер
Сеттер плохой, как раз с точки зрения ООП, так как занимается смешением ролей: ввод находится внутри, да еще и фиксирован на конкретный способ.
Проблемы начнутся сразу же, как он поробует применить какой-то другой способ, например ввод с графической формы.
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
15.02.2019, 13:11
Руслан92, Я не буду советовать, просто опишу как вижу это я
1. Разделение на файлы нужно, я для каждого класса выделяю, обычно, отдельные файлы реализации и заголовка. Сегодня у вас там 3 строчки, а через неделю будет 300
2. Я использую один заголовочный файл для всех библиотек, которые я буду использовать практически везде, а потом этот один файл инклудю где нужно
3. Конечно можно, просто в глобальной области не используйте
4. В вектор помещается копия, т.к. вы его так создали, если бы хранили указатели, то тогда в векторе были бы указатели А оригинал хранится в памяти, где вы выделили на него место методом new, я по всему коду не пробегал, но этот кусок сразу бросился в глаза, что у вас возможна утечка памяти.
7. ifstream по умолчанию открывает на чтение, указывать ios::in не обязательно и т.д. Когда указывают binary, обычно это обозначает что будут работать с бинарными данными, а не текстом, допустим, если написать так:
C++
1
2
3
4
5
6
7
ofstream f("test1.txt", ios::binary);
f << "123\n";
f.close();
 
ofstream f1("test2.txt");
f1 << "123\n";
f1.close();
И потом посмотреть содержимое файла, то они будут разные, т.к. при работе с бинарным типом, символ переноса строки (и не только) будет интерпретироваться по разному
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 13:21
Цитата Сообщение от DrOffset Посмотреть сообщение
Сеттер плохой, как раз с точки зрения ООП
сорян, я про этот говорил, думал что он
Цитата Сообщение от golatin Посмотреть сообщение
void PetShop::set_cost(int cost)
{
this->cost = cost;
};
1
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
15.02.2019, 13:23
Цитата Сообщение от _stanislav Посмотреть сообщение
я про этот говорил
Этот нормальный
1
Just Do It!
 Аватар для XLAT
4220 / 2683 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
15.02.2019, 13:25
Цитата Сообщение от Azazel-San Посмотреть сообщение
я бы не стал насаживать свой стиль кому-то, это тема холиваров
все верно, тут не о чем спорить.

1. один класс --- один файл.
2. название хедера должно соответствовать названию класса.
3. название класса должно соответствовать сущности, которую класс описывает.

это не я придумал, а все те же люди из того же продакшена.

но если ваш стиль через "одно" место, но если вы его придерживаетесь, вы привыкаете и вас это может вполне устраивать,
пока вы в проекте один.
3
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 13:32
Цитата Сообщение от XLAT Посмотреть сообщение
пока вы в проекте один.
в своем проекте я царь и бог

Добавлено через 1 минуту
у меня объявления функций в .cpp а определения в .h, мне так удобно, но я ко всему быстро привыкаю.
2
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.02.2019, 13:37
Цитата Сообщение от XLAT Посмотреть сообщение
но если ваш стиль через "одно" место, но если вы его придерживаетесь, вы привыкаете и вас это может вполне устраивать,
пока вы в проекте один.
Это ваш девиз?
1
15.02.2019, 13:49

Не по теме:

Цитата Сообщение от Azazel-San Посмотреть сообщение
Это ваш девиз?
троллфейсный офтоп?
а не хотите ли вы знать: пью я колу или нет???

а ваще то это не девиз, а наблюдение за вами)

0
15.02.2019, 14:00

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
а наблюдение за вами
Ну, это не я пишу стилем "через одно место" и не у меня подгорает из-за правды..

0
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 14:05  [ТС]
Avaddon74
Цитата Сообщение от Avaddon74 Посмотреть сообщение
В вектор помещается копия, т.к. вы его так создали, если бы хранили указатели, то тогда в векторе были бы указатели А оригинал хранится в памяти, где вы выделили на него место методом new, я по всему коду не пробегал, но этот кусок сразу бросился в глаза, что у вас возможна утечка памяти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vector <petshop> v;
    v.reserve(1000);
    petshop *s;
    int i;
 
    for (;;) {
        answer = menu();
        switch (answer)
        {
        case 0: {
            s = new petshop;
            s->set_animal();
            s->set_name();
            s->set_gender();
            s->set_cost();
            s->set_count();
            v.emplace_back(*s);
            delete s;
            break;
        }
Я же здесь через указатели делаю. new есть, delete есть...где утечка?

Добавлено через 1 минуту

DrOffset
Цитата Сообщение от DrOffset Посмотреть сообщение
Сеттер плохой, как раз с точки зрения ООП, так как занимается смешением ролей: ввод находится внутри, да еще и фиксирован на конкретный способ.
Приведите пример хорошего сеттера (желательно какой-нибудь сеттер в моем классе исправить на тот, который будет хорошим)
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
15.02.2019, 14:35
Лучший ответ Сообщение было отмечено Руслан92 как решение

Решение

Цитата Сообщение от Руслан92 Посмотреть сообщение
fromfile >> *s->get_cost();
Вот, кстати, пример того, что сеттер негодный, в месте, где вам был необходим ввод из файла, пришлось городить такие странные конструкции.

Цитата Сообщение от Руслан92 Посмотреть сообщение
Приведите пример хорошего сеттера
Хороший сеттер - это тот, который занимается своей прямой обязанностью - устаналивает состояние класса.
C++
1
2
3
void petshop::set_cost(int a) {
    cost = a;
}
А вывод сообщения пользователю и ввод данных - это дело того, кто этим сеттером пользуется. Каждая сущность должна заниматься своим делом. А ее нотация должна отражать суть этого дела. Если у вас написано set_cost, то совершенно очевидно ожидать от этой функции установку состояния "цена" у класса, но совершенно не очевидно, что оно будет выводить приглашение для ввода цены в консоль и точно не очевидно, что оно будет блокировать управление, ожидая ввода из консоли. И уж точно никто не увидит этого, если вы попробуете перенести класс в приложение GUI - ведь там нет консоли. Стоит также отличать эту ситуацию от вывода в лог. Ваш текст в консоль - это часть логики, от которой зависит то, как пользователь будет работать с приложением, а вывод в лог обычно пользователя не касается никак.

Тоже самое касается геттеров. Учитывая пример выше, ваш геттер - это тоже некоторым образом сеттер, т.к. предоставляет прямой доступ к внутреннему состоянию класса. Это является и нарушением инкапсуляции (любой неконтролируемым образом сможет измненить это состояние через указатель на данные, которые вернул геттер), так и примером смешения ролей, которое вы продемонстрировали в процитированном в начале сообщения коде.
C++
1
2
3
int petshop::get_cost() const {
    return cost;
}
Вы должны понять, что все эти действия - это не просто ритуалы, это средства понижения сложности разработки и сопровождения кода. Гораздо лучше, как пример, когда у вас есть один контролируемый способ поменять состояние класса, чем множество неконтролируемых.

Добавлено через 1 минуту
Цитата Сообщение от Руслан92 Посмотреть сообщение
где утечка?
Она здесь потенциально может быть, если emplace_back (или один из сеттеров) бросит исключение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2019, 14:35

Прошу оценить
1. Видеокарта Sapphire Radeon HD3470 256Mb GDDR3 PCI-E DUAL DVI-I/TVO. 2. Видеокарта Sapphire X1650 256m DDR2 AGP VGA/TVO/DVI-I. 3....

Прошу оценить
Здравствуйте. Пересмотрел пол сотни роликов, почитал тут, и не только. В результате чего сформировалось отчетливая каша в голове. Очень...

Прошу оценить пк
Вот характеристики: ЦП: QuadCore AMD Phenom II X4 Black Edition 965, 3415 MHz; Системная плата: ASRock 890FX Deluxe4; Оперативная...

Прошу оценить
Здравствуйте подскажите пожалуйста за сколько можно продать компьютер с характеристиками как на фото.

Прошу оценить пк
Добрый день.Прошу оценить пк для игр Процессор Intel Core i5-4590 Материнская плата ASUS B85M-G Память Kingston HyperX Fury DDR-III...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru