Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для ProJyZ
8 / 8 / 0
Регистрация: 11.06.2023
Сообщений: 21

Абстрактный класс Cats. Наследование

14.06.2023, 21:12. Показов 2730. Ответов 33

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

Итак, лабораторка:
В рамках работы необходимо разработать иерархию классов на указанную в варианте тему. В иерархии должен быть корневой класс (базовый), который должен быть абстрактным и содержать общие для остальных поля и методы. У каждого из классов должен быть хотя бы один собственный метод. Также должны быть продемонстрированы виртуальные и переопределённые методы. Переопределенные методы должны также вызывать методы базового класса если это оправдано.
В каждом классе должны быть:
1. метод, выводящий имя данного класса;
2. метод, выводящий в виде строки всю информацию об объекте – тип, имена и значения полей;
3. конструктор без параметров;
4. конструктор с параметрами;
5. деструктор.
Рекомендуемые поля и методы указаны в варианте, однако возможно придумать и свои.
Также необходимо написать программу с меню, позволяющую протестировать разработанную иерархию.
В ходе программы создаётся массив минимум из 4-х элементов, в котором хранятся указатели на объекты базового класса.
Обязательные пункты меню:
1. добавление нового объекта выбранного пользователем класса в массив;
2. выполнение указанного метода базового класса для всех объектов массива (у каждого должен выполниться перегруженный вариант);
3. вывод всех объектов в массиве;
4. выполнение уникального для указанного объекта метода.

Вариативная часть:
Класс: Кошки;
Варианты полей: вес, пол, возраст, имя;
Варианты методов: поиграть, покормить, погладить;
Возможные классы иерархии: кошки (базовый), шотландская вислоухая, мейн кун, персидская, сфинкс (хотя это такая себе кошка);

Мой код:
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
#include <iostream>
#include <string>
using namespace std;
//Абстрактный базовый класс Cats
class Cats {
protected:
    string name, gender;
    float weight;
    unsigned short int age;
 
public:
    //КОНСТРУКТОР БЕЗ ПАРАМЕТРОВ
    Cats() {
        name, gender = "";
        weight = 1.0F;
        age = 0;
    }
 
    //КОНСТРУКТОР С ПАРАМЕТРАМИ
    Cats(string& name, string& gender, unsigned short int age, float weight) : name(name), gender(gender), age(age), weight(weight) {
 
    }
 
    //ДЕСТРУКТОР
    virtual ~Cats() {
 
    }
 
    //СЕТТЕРЫ
    void set_name(string name) {
        this->name = name;
    }
    void set_gender(string gender) {
        this->gender = gender;
    }
    void set_age(unsigned short int age) {
        this->age = age;
    }
    void set_weight(float weight) {
        this->weight = weight;
    }
 
    //ГЕТТЕРЫ
    string get_name()const {
        return name;
    }
    string get_gender()const {
        return gender;
    }
    unsigned short int get_age()const {
        return age;
    }
    float get_weight()const {
        return weight;
    }
    virtual string get_classname()const {
        return "Cats";
    }
 
    //МЕТОДЫ ВВОДА С КЛАВИАТУРЫ
    void cin_name() {
        cout << "Enter name your cat: ";
        while (!(cin >> name)) {
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
            cout << "Not correct name. Enter again: ";
        }
        cout << endl;
    }
    void cin_gender() {
        cout << "Enter gender your cat: ";
        while (!(cin >> gender)) {
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
            cout << "Not correct gender. Enter again: ";
        }
        cout << endl;
    }
    void cin_age() {
        cout << "Enter age your cat(years!): ";
        while (!(cin >> age)) {
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
            cout << "Not correct age. Enter again: ";
        }
        cout << endl;
    }
    void cin_weight() {
        cout << "Enter weight your cat(kilogamms!): ";
        while (!(cin >> weight) || weight <= 0) {
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
            cout << "Not correct weight. Enter again: ";
        }
        cout << endl;
    }
    void cin_fields() {
        cin_name();
        cin_gender();
        cin_age();
        cin_weight();
    }
 
    //МЕТОДЫ ВЫВОДА НА ЭКРАН
    virtual void show_classname()const {
 
        cout << "Class: Cats" << endl;
    }
    void show_name()const {
 
        cout << "Name: " << get_name() << endl;
    }
    void show_gender()const {
 
        cout << "Gender: " << get_gender() << endl;
    }
    void show_age()const {
 
        cout << "Age: " << get_age() << endl;
    }
    void show_weight()const {
 
        cout << "Weight: " << get_weight() << endl;
    }
    void show_class()const {
 
        show_classname();
        show_name();
        show_gender();
        show_age();
        show_weight();
    }
 
    //ВИРТУАЛЬНЫЕ МЕТОДЫ
    virtual void play()const {
        cout << "You play with " << name << ". " << name << " wants to be pet." << endl;
    }
    virtual void pet()const {
        cout << "You pet " << name << ". " << name << " wants to eat." << endl;
    }
    virtual void feed()const {
        cout << "You feed " << name << ". " << name << " fell asleep." << endl;
    }
 
    //Виртуальные пустые методы для реализации в наследниках
    virtual void fluffed()const{}
    virtual void scratch()const {}
    virtual void surprised()const {}
    virtual void ask_for_more()const {}
};
 
//Класс иерархии
class Maine_coon : public Cats {
public:
    Maine_coon() : Cats() {}
    Maine_coon(string& name, string& gender, unsigned short int age, float weight) : Cats(name, gender, age, weight) {}
    ~Maine_coon()override {}
    //Вывод имени класса
    void show_classname()const override {
 
        cout << "Class: Maine_coon" << endl;
    }
    string get_classname()const override {
        return "Maine_coon";
    }
    //Вывод имени класса и полей одновременно
    void show_class()const {
        show_classname();
        show_name();
        show_gender();
        show_age();
        show_weight();
    }
    //Переназначенные методы базового класса
    void play()const override {
        cout << "You play with your maine coon " << get_name() << ". " << get_name() << " wants to be pet." << endl;
    }
    void pet()const override {
        cout << "You pet your maine coon " << get_name() << ". " << get_name() << " wants to eat." << endl;
    }
    void feed()const override {
        cout << "You feed your maine coon " << get_name() << ". " << get_name() << " fell asleep." << endl;
    }
    //Уникальный для класса Maine_coon метод
    void fluffed()const {
        cout << "Your maine coon " << get_name() << " fluffed up. " <<  get_name() << "is is such a cutie!" << endl;
    }
 
};
 
//Класс иерархии
class Scottish_fold : public Cats {
public:
    Scottish_fold() : Cats() {}
    Scottish_fold(string& name, string& gender, unsigned short intage, float weight) : Cats(name, gender, age, weight) {}
    ~Scottish_fold()override{}
    //Вывод имени класса
    void show_classname()const override {
 
        cout << "Class: Scottish_fold" << endl;
    }
    string get_classname()const override {
        return "Scottish_fold";
    }
    //Вывод имени класса и полей одновременно
    void show_class()const {
        show_classname();
        show_name();
        show_gender();
        show_age();
        show_weight();
    }
    //Переназначенные методы базового класса
    void play()const override {
        cout << "You play with your scottish fold " << get_name() << ". " << get_name() << " is angry." << endl;
    }
    void pet()const override {
        cout << "You pet your scottish fold " << get_name() << ". " << get_name() << " bites you." << endl;
    }
    void feed()const override {
        cout << "You feed your scottish fold " << get_name() << ". " << get_name() << " sniffs with displeasure." << endl;
    }
    //Уникальный для класса Scottish_fold метод
    void scratch()const {
        cout << "Your scottish fold " << get_name() << " scratch your hand. Why did " << get_name() << " do this? It hurts." << endl;
    }
};
 
//Класс иерархии
class Persian : public Cats {
public:
    Persian() : Cats() {}
    Persian(string& name, string& gender, unsigned short int age, float weight) : Cats(name, gender, age, weight) {}
    ~Persian()override {}
    //Вывод имени класса
    void show_classname()const override {
 
        cout << "Class: Persian" << endl;
    }
    string get_classname()const override {
        return "Persian";
    }
    //Вывод имени класса и полей одновременно
    void show_class()const {
        show_classname();
        show_name();
        show_gender();
        show_age();
        show_weight();
    }
    //Переназначенные методы базового класса
    void play()const override {
        cout << "You play with your persian " << get_name() << ". " << get_name() << " rub against your legs." << endl;
    }
    void pet()const override {
        cout << "You pet your persian " << get_name() << ". " << get_name() << " looks surprised." << endl;
    }
    void feed()const override {
        cout << "You feed your persian " << get_name() << ". " << get_name() << " fell asleep." << endl;
    }
    //Уникальный для класса Persian метод
    void surprised() {
        cout << get_name() << " opens his eyes wide and starts snorting. Maybe you did something wrong?" << endl;
    }
};
 
//Класс иерархии
class Sphinx : public Cats {
public:
    Sphinx() : Cats() {}
    Sphinx(string& name, string& gender, unsigned short int age, float weight) : Cats(name, gender, age, weight) {}
    ~Sphinx()override {}
    //Вывод имени класса
    void show_classname()const override {
 
        cout << "Class: Sphinx" << endl;
    }
    string get_classname()const override {
        return "Sphinx";
    }
    //Вывод имени класса и полей одновременно
    void show_class()const {
        show_classname();
        show_name();
        show_gender();
        show_age();
        show_weight();
    }
    //Переназначенные методы базового класса
    void play()const override {
        cout << "You play with your sphinx " << get_name() << ". " << get_name() << " is tired." << endl;
    }
    void pet()const override {
        cout << "You pet your sphinx " << get_name() << ". " << get_name() << " is trying to lick your hand." << endl;
    }
    void feed()const override {
        cout << "You feed your sphinx " << get_name() << ". " << get_name() << " asks for more." << endl;
    }
    //Уникальный для класса Sphinx метод
    void ask_for_more()const {
        cout << get_name() << " gets up on his hind legs and starts waving his front paws! You'll do whatever he asks." << endl;
    }
};
 
 
int main() {
    //Переменные для switch-case
    unsigned short int menu, menu_add, menu_unique_method;
    //Переменная счётчик котов в массиве
    unsigned short int k = 0;
    //Максимальное количество элементов в массиве
    const unsigned short int max_cats = 100;
    //Переменные для определения полей объектов классов
    string name, gender = "";
    unsigned short int age = 0;
    float weight = 0;
 
    Cats* cats_arr[max_cats] = { nullptr };
    do {
        cout << "Enter menu point:" << endl << endl
            << "1)Add new cat" << endl
            << "2)Show all cat in array" << endl
            << "3)play() for all cats of the array" << endl
            << "4)pet() for all cats of the array" << endl
            << "5)feed() for all cats of the array" << endl
            << "6)Execute a unique method for cat" << endl
            << "7)End" << endl;
 
        while (!(cin >> menu) || menu > 7 || menu < 1) {
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
            cout << "You are make a mistake. Please, enter menu point" << endl;
        }
 
        switch (menu)
        {
        case 1: {
            if (k < max_cats) {
                cout << "Which cat do you want to add?" << endl << endl
                    << "1)Maine coon" << endl
                    << "2)Scottish fold" << endl
                    << "3)Persian" << endl
                    << "4)Sphinx" << endl;
 
                while (!(cin >> menu_add) || menu_add > 4 || menu_add < 1) {
                    cin.clear();
                    cin.ignore(cin.rdbuf()->in_avail());
                    cout << "You are make a mistake. Please, enter which cat do you want to add?" << endl;
                }
 
                switch (menu_add)
                {
                case 1: {
                    cats_arr[k] = new Maine_coon(name, gender, age, weight);
                    cats_arr[k]->cin_fields();
                    k++;
                    break;
                }
                case 2: {
                    cats_arr[k] = new Scottish_fold(name, gender, age, weight);
                    cats_arr[k]->cin_fields();
                    k++;
                    break;
                }
                case 3: {
                    cats_arr[k] = new Persian(name, gender, age, weight);
                    cats_arr[k]->cin_fields();
                    k++;
                    break;
                }
                case 4: {
                    cats_arr[k] = new Sphinx(name, gender, age, weight);
                    cats_arr[k]->cin_fields();
                    k++;
                    break;
                }
                }
 
                break;
            }
            else {
                cout << "Too many cats!" << endl;
            }
        }
        case 2: {
            if (k != 0) {
                for (int i = 0; i < k; i++) {
                    cout << i + 1 << ":" << endl;
                    cats_arr[i]->show_class();
                }
            }
            else {
                cout << "No cats in array" << endl;
            }
            break;
        }
        case 3: {
            if (k != 0) {
                for (int i = 0; i < k; i++) {
                    cats_arr[i]->play();
                }
            }
            else {
                cout << "No cats in array" << endl;
            }
            break;
        }
        case 4: {
            if (k != 0) {
                for (int i = 0; i < k; i++) {
                    cats_arr[i]->pet();
                }
            }
            else {
                cout << "No cats in array" << endl;
            }
            break;
        }
        case 5: {
            if (k != 0) {
                for (int i = 0; i < k; i++) {
                    cats_arr[i]->feed();
                }
            }
            else {
                cout << "No cats in array" << endl;
            }
            break;
        }
        case 6: {
            if (k != 0) {
                cout << "For which breed will we execute the method?" << endl << endl
                    << "1)Maine coon" << endl
                    << "2)Scottish fold" << endl
                    << "3)Persian" << endl
                    << "4)Sphinx" << endl;
 
                while (!(cin >> menu_unique_method) || menu_unique_method > 4 || menu_unique_method < 1) {
                    cin.clear();
                    cin.ignore(cin.rdbuf()->in_avail());
                    cout << "You are make a mistake. Please, enter for which breed will we execute the method?" << endl;
                }
 
                switch (menu_unique_method)
                {
                case 1: {
                    int in_k = 0;
                    for (int i = 0; i < k; i++) {
                        if (cats_arr[i]->get_classname() == "Maine_coon") {
                            cats_arr[i]->fluffed();
                            in_k++;
                        }
                    }
                    if (in_k == 0) {
                        cout << "You not have a maine coon" << endl;
                    }
                    break;
                }
                case 2: {
                    int in_k = 0;
                    for (int i = 0; i < k; i++) {
                        if (cats_arr[i]->get_classname() == "Scottish_fold") {
                            cats_arr[i]->scratch();
                            in_k++;
                        }
                    }
                    if (in_k == 0) {
                        cout << "You not have a scottish fold" << endl;
                    }
                    break;
                }
                case 3: {
                    int in_k = 0;
                    for (int i = 0; i < k; i++) {
                        if (cats_arr[i]->get_classname() == "Persian") {
                            cats_arr[i]->surprised();
                            in_k++;
                        }
                    }
                    if (in_k == 0) {
                        cout << "You not have a persian" << endl;
                    }
                    break;
                }
                case 4: {
                    int in_k = 0;
                    for (int i = 0; i < k; i++) {
                        if (cats_arr[i]->get_classname() == "Sphinx") {
                            cats_arr[i]->ask_for_more();
                            in_k++;
                        }
                    }
                    if (in_k == 0) {
                        cout << "You not have a sphinx" << endl;
                    }
                    break;
                }
                }
                break;
            }
            else {
                cout << "No cats in array" << endl;
            }
        }
        }
    } while (menu != 7);
 
     for (int i = k; i >= 0; --i) {
         delete cats_arr[i];
     }
 
    return 0;
}
P.s. Выполнение этой лабы было самым кайфовым, что со мной случалось в институте. Сколько фотографий с котиками я пересмотрел, пока её делал - не счесть!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.06.2023, 21:12
Ответы с готовыми решениями:

Абстрактный класс, наследование, класс хранится в другом классе
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

Абстрактный класс. Наследование
class polygon{ int height, width, point p; e_color color; public: virtual ~polygon(){} ...

Наследование и абстрактный класс
Вот сделал список с такими условиями #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; ...

33
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
15.06.2023, 12:33
Студворк — интернет-сервис помощи студентам
KSergey9, "Представьте, например, что в конструкторе динамически выделяется память. Тогда затем в копирующем операторе присваивания эта память будет переопределяться" - а если динамическая память не выделяется?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.06.2023, 12:50
Цитата Сообщение от eva2326 Посмотреть сообщение
Вам нужно объяснять причину, почему для простых полей разницы нет?
Вы читаете почему-то выборочно.
Мне уже было лень писать сразу, но сейчас напишу:
умаю, что основное - это не "больше накладных расходов" из-за повторной инициализацией, логично, что оптимизатор это выкинет, но есть еще другой аспект: порядок инициализации. И вот он уже может быть разным при инициализации полей за пределами конструктора и внутри конструктора.

Впрочем, вероятно я действительно зря написал "простые типы".

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
а если динамическая память не выделяется?
Тогда разницы не будет в смысле производительности. Но что нам даёт рассмотрение упрощенного случая?

Добавлено через 3 минуты
Еще есть существенный момент для "где инициализировать" - это случай, когда конструктор какого-то поля класса выкидывает исключение. (да, это явно не про "простые типы")
Но расписывать подробно не буду, а то тут все сильно умные, без дела до запятых докапываются без предлагания своих верных определений, а я стопроцентов тут налажаю в каком-нибудь нюансе, если возьмусь сам про это писать.
Кому интересно - нагуглит тему
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
15.06.2023, 13:17
Цитата Сообщение от KSergey9 Посмотреть сообщение
повторной инициализацией
Это - чушь.
Вот здесь нет никакой "повторной" инициализации
C++
1
2
3
4
some()
{
    a = 10; // Это - присвоение, а не инициализация
};
Цитата Сообщение от KSergey9 Посмотреть сообщение
логично, что оптимизатор это выкинет
Нет, не логично. Вы написали чушь.
Нельзя выкинуть то, чего не существует.

Если явно не задать стартовое значение, то объект примитивного типа будет содержать мусор.
Это связанно с тем, что у примитивных типов вообще нет никаких конструкторов.
Для примитивных типов, компилятор не генерирует никакого специального кода, который бы как то инициализировал память по умолчанию. Поэтому оптимизировать попросту нечего.

Цитата Сообщение от KSergey9 Посмотреть сообщение
порядок инициализации. И вот он уже может быть разным при инициализации полей за пределами конструктора и внутри конструктора
Вы сами поняли, что написали?


Порядок инициализации зависит только и только от порядка объявления полей.
И имеет значение только и только на стадии инициализации полей.
К моменту запуска основного тела конструктора, вся инициализация полей уже завершена.

Ваши "разные порядки инициализации полей за пределами конструктора, и внутри конструктора" - это какой то бред. Бессмысленный набор слов.

Добавлено через 2 минуты
Цитата Сообщение от KSergey9 Посмотреть сообщение
Еще есть существенный момент для "где инициализировать"
Единственный существенный момент про "где инициализировать", который вам нужно знать, заключается в том, что инициализировать поля может только и только в списках инициализации, и больше нигде.
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.06.2023, 13:18
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы написали чушь.
Цитата Сообщение от eva2326 Посмотреть сообщение
Бессмысленный набор слов.
Цитата Сообщение от eva2326 Посмотреть сообщение
Это - чушь.
Девушка (или вьюноша, кто его разберёт), выдохните, выпейте "Ново-Пассита" (реклама щедро оплачена). А после напишите уже нам, неразумным, как оно есть на самом деле.
Уверен, мир станет много лучше.

И да, прекратите хамить. Это фу как некрасиво.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
15.06.2023, 13:22
Цитата Сообщение от KSergey9 Посмотреть сообщение
прекратите хамить
Это что ещё за бред? Вы вообще понимаете, что означает это слово?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.06.2023, 13:29
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы вообще понимаете, что означает это слово?
По остальным пунктам вопросов, стало быть, нет.
Ну и славно.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
15.06.2023, 14:08
Цитата Сообщение от KSergey9 Посмотреть сообщение
Тогда разницы не будет в смысле производительности. Но что нам даёт рассмотрение упрощенного случая?
- я, что называется, "сделал стойку" на выражение "никогда не делайте так". Меня такие запреты (без соответствующих объяснений) раздражают.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,447
15.06.2023, 14:20
Цитата Сообщение от KSergey9 Посмотреть сообщение
Девушка (или вьюноша, кто его разберёт)
Прекращай сексизм
Цитата Сообщение от KSergey9 Посмотреть сообщение
выдохните, выпейте "Ново-Пассита" (реклама щедро оплачена).
Я не понимаю, почему ты так горячишься? Она хочет тебе только добра, ведь человек тратит свое время на все эти объяснения. Тебе это не интересно, тогда просто так и ей скажи. Но скажу от себя, что eva2326 эксперт в С++ и не помешало бы её выслушать. Одно дело когда человек знает от своего опыта, а другое - когда вырывает цитаты из интернета, не до конца понимая суть.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Но расписывать подробно не буду, а то тут все сильно умные, без дела до запятых докапываются без предлагания своих верных определений, а я стопроцентов тут налажаю в каком-нибудь нюансе, если возьмусь сам про это писать.
Это так тебе кажется. На форуме есть люди, которые любят докапываться, но сейчас это не тот случай. Многие среди экспертов видят, что ты претендуешь на более высокий уровень, раз сам уже учишь молодых, причем делаешь это в довольно самоуверенном стиле. Поэтому они хотят, чтобы ты оставался на верном пути.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.06.2023, 14:42
Цитата Сообщение от Royal_X Посмотреть сообщение
человек тратит свое время на все эти объяснения.
Я не увидел складный объяснений. Только указания где чушь.
Цитата Сообщение от Royal_X Посмотреть сообщение
Многие среди экспертов видят, что ты претендуешь на более высокий уровень
Вы имеете что-то против написания мною сообщений?
Цитата Сообщение от Royal_X Посмотреть сообщение
Поэтому они хотят, чтобы ты оставался на верном пути.
Еще можно в рыло закатать. Для верности пути. А что? в соответствующей среде очень даже обычное дело. Здесь вот как раз та среда, я верно понял? и её стоит культивировать? Вы к этому ведёте?

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Прекращай сексизм
Обращение парень/девушка уже сексизм?!

0
15.06.2023, 14:52

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
Я не увидел складный объяснений. Только указания где чушь.
вы увидели то, что хотели увидеть, а ведь там были и объяснения
Цитата Сообщение от KSergey9 Посмотреть сообщение
Вы имеете что-то против написания мною сообщений?
Нет, конечно же нет! Почему вы вдруг так подумали? Наоборот, активное участие на форуме только поощряется.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Еще можно в рыло закатать. Для верности пути.
Я не знаю, почему вы так извращенно воспринимаете критику.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Обращение парень/девушка уже сексизм?!
А вы на форуме со всеми обращаетесь "парень или кто его разберет"?

0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
15.06.2023, 15:02
Цитата Сообщение от Catstail Посмотреть сообщение
"сделал стойку" на выражение "никогда не делайте так". Меня такие запреты (без соответствующих объяснений) раздражают.
Вам я бы и не стал такое писать. Суть не в уважении там каком-нибудь, а в опыте и кругозоре в понимании того где и что и как применять.
А для новичка - да, формулировка весьма императивная. На мой взгляд, вполне допустимо навязать догмы полезные, а уже потом человек разберётся что где и почему. Но до того момента наломает меньше дров просто следуя догмам, пусть и без понимания глубины и сути. Ибо если всё объяснять и сразу - в общем мне как-то жаль такого новичка, на которого по каждой проблеме вываливают абсолютно все глубины сразу.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.06.2023, 21:37
Цитата Сообщение от KSergey9 Посмотреть сообщение
для новичка - да, формулировка весьма императивная. На мой взгляд, вполне допустимо навязать догмы полезные, а уже потом человек разберётся что где и почему. Но до того момента наломает меньше дров просто следуя догмам, пусть и без понимания глубины и сути. Ибо если всё объяснять и сразу - в общем мне как-то жаль такого новичка, на которого по каждой проблеме вываливают абсолютно все глубины сразу.
KSergey9, суть накопления опыта (осознания практической целесообразности) состоит в том, чтобы наломать как можно больше дров. Ваша императивность была чересчур императивна. И особенно учитывая отсутствие объяснения. Порядок инициализации не зависит от порядка в списке инициализации. Она зависит от порядка объявления. Вот тот простой факт, что инициализация полей при объявлении иногда позволяет отказаться от описания конструктора по умолчанию ограничившись =default;, действительно, может снизить количество кода. Но зато видя конструктор вы с одного взгляда можете сказать, что и чем инициализируется по умолчанию, то есть, не просматривая всё тело описания класса. Вопрос не однозначный. Иногда да, иногда - нет. Императивность "всегда", бывает нужна при ловле блох (имо) )
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.06.2023, 05:40
Цитата Сообщение от IGPIGP Посмотреть сообщение
И особенно учитывая отсутствие объяснения.
Еще один.
Где были ваши объяснения, помимо не относящихся к делу пространных рассуждений по зоо-терминологии?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.06.2023, 08:13
Цитата Сообщение от KSergey9 Посмотреть сообщение
Еще один.
Замечательное воспитание.
KSergey9, ещё один возглас в таком духе и вы - ещё один, с которым я не стану общаться.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Где были ваши объяснения, помимо не относящихся к делу пространных рассуждений по зоо-терминологии?
Объяснения там, где им положено быть. Найдите у меня безапелляционное утверждение типа :
Цитата Сообщение от KSergey9 Посмотреть сообщение
Никогда не следует инициализировать простые поля внутри конструктора.
без пояснений (думаю, у меня это можно найти, как и у всех, почти) и я вместо попыток бросить какашку буду объяснять.
Что касается предметной области (о кошках тема), то она просто напрямую связана с классами и наследованием. То что вы этого не чувствуете не упрёк. Я видел достаточно много программистов C++, которые не имеют глубокого понимания базовых вещей и нормально живут.
Я писал о том, что виртуальный метод, возвращающий имя домашней кошки, это глумление над наследованием. И ещё я писал, что стоит подумать над теми формами поведения, которые действительно, стоит имплементировать у потомков для кошачьих. На уровне интерфейса, представляемого чисто виртуальным методом.
О аксессорах я тоже написал с аргументацией. ТС, кстати, всё понял настолько хорошо, что я даже плюсанул его ответное обращение.
KSergey9, вместо того, чтобы огрызаться в стиле "сам дурак", который предполагает неявное согласие с тем что "я дурак, но и ты тоже", просто отвечайте с аргументами, если они есть. Я "ещё один" не случайно. И для меня важно не то что вместо "иногда", вы употребили "всегда", там где это не нужно. Я выступил увидев ваш пассаж о императивности для новичка. Что есть вид бессмысленного и беспощадного интеллектуального насилия.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2023, 08:13

Наследование классов, абстрактный класс
Добрый день. Имеется такое задание: Большинство иерархий классов не связано с графикой . Определите класс Iterator, содержащий чисто...

Абстрактный класс,массив классов,наследование
Доброго времени суток,нужна помощь в решении вот такой задачки: 1)Создать абстрактный класс Vehicle. На его основе реализовать классы...

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

Абстрактный базовый класс и множественное наследование
Общая постановка. Создать программу с абстрактным базовым классом и множественным наследованием, реализовать в нем: • конструктор, ...

Абстрактный класс, одиночное наследование, далее множественное
Добрый вечер! никак не могу найти информацию о том, как правильно реализуется следующее действие: есть абстрактный класс А, от него...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru