Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335

Классы и объекты. Прошу проверить правильность

07.05.2020, 22:57. Показов 1295. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго, коллеги.

Вот дошел до изучения классов, начирикал небольшой примерчик для себя, в котором игроку либо прибавляется жизнь либо наоборот.
Попросил бы если можно проверить, правильно ли я понял эту тему? Ну то есть, в реальных программах так делается то вообще? Приветствую любую конструктивную критику, дабы на начальном этапе не привыкнуть делать не правильно!

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
/// КЛАСС - class_get_heart
 
#include <windows.h>
#include <iostream>
using namespace std;
 
class get_heart
{
    public:
    int green_heart;
    int yellow_heart;
    int red_heart;
    int grey_heart;
    int black_heart;
    int player_life = 5;      // одна жизнь персонажа = 5 делениям
    int x, y;
 
    public:
    void method_get_heart()   // метод добавляет/отнимает здоровье/жизнь персонажа
    {
       if (x == 14 && y == -6)
       {
           player_life = player_life + 1;                      // прибавляем 1 деление
           cout << "\n вы взяли зеленое сердечко (+ 1)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == 10 && y == 15)
       {
           player_life = player_life + 2;                      // прибавляем 2 деления
           cout << "\n вы взяли желтое сердечко (+ 2)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == -14 && y == 11)
       {
           player_life = player_life + 5;                      // прибавляем 1 жизнь
           cout << "\n вы взяли красное сердечко (+ 1 жизнь)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == -14 && y == -4)
       {
           player_life = player_life - 5;                      // отнимаем 1 жизнь
           cout << "\n вы взяли черное сердечко (- 1 жизнь)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else if (x == -6 && y == -12)
       {
           player_life = player_life - 1;                      // отнимаем 1 деление
           cout << "\n вы взяли серое сердечко (- 1)";
           cout << "\n уровень здоровья = " << player_life;
       }
       else
       {
           cout << "\n здесь пусто";
           cout << "\n уровень здоровья = " << player_life;
       }
 
    }
};
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
system("chcp 1251>0");
 
get_heart h1;    // создаем объект класса
h1.green_heart;
h1.yellow_heart;
h1.red_heart;
h1.grey_heart;
h1.black_heart;
h1.player_life;
h1.x;
h1.y;
 
cout << "\n начальный уровень здоровья = " << h1.player_life;
 
while (h1.player_life != 0)                             // цикл работает пока жинь персонажа не обнулится
{
    cout << "\n\n enter the coordinates ( х / y ): ";
    cin >> h1.x >> h1.y;
 
    h1.method_get_heart();                              // вызов метода класса на выполнение
 
    if (h1.player_life == 0 || h1.player_life < 0)      // как только счетчик уровня жизни = 0 или меньше 0
    {
        cout << "\n игра окончена!";                    // выводим сообщение
        return 0;                                       // завершаем игру
    }
}
 
 
system("pause>0");
return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2020, 22:57
Ответы с готовыми решениями:

прошу проверить на правильность if ! ) так же прикрепил файл с блок -схемой и кодом
ln|x| при sinx+cos2x при z= x*x*x+1 при x+1/x*x+8 при ln x в остальных случаях ...

Найти изображение функции (прошу проверить правильность решения)
Здравствуйте! Пожалуйста, проверьте, правильно ли выполнила задание? Найти изображение функции: e-t * sh t = 1 / ((p+a)2 - 1)

Прошу проверить правильность решения задач по теории принятия решений
Добрый день! Прошу проверить, правильно ли решены задания? Мой вариант выполнения и числовые данные для вариантов - в файле Excel в...

36
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
08.05.2020, 00:40  [ТС]
Студворк — интернет-сервис помощи студентам


БЕРУ ПАУЗУ ДО ЗАВТРА, УЖЕ ПАДАЮ! Благодарю за отклик "ребят"
0
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
09.05.2020, 11:30  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вы делаете player_life открытым членом, то обесцениваете наличие метода get_heart класса. В любой момент некий сторонний код может взять и сломать состояние, которое задано этим методом.
Всех приветствую и конечно с праздником! Вот вернулся к теме.

Вроде дошло в чем проблема. Я использую переменную - p1.player_life в функции - main. Что вроде как не допустимо. И получилось у меня это из-за того что я открыл к ней доступ в теле класса, сделал публичным.

Но вот вопрос а как же мне быть, ведь часть логики должна выполняться в основной функции!?

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
int main()
{
system("chcp 1251>0");
 
 
 
player p1;         // создаем объект класса
 
cout << "\n начальный уровень здоровья = " << p1.player_life;
 
while (p1.player_life != 0)                             // цикл работает пока жинь персонажа не обнулится
{
    cout << "\n\n enter the coordinates ( х / y ): ";
    cin >> p1.x >> p1.y;
 
    p1.method_get_heart();                              // вызов метода класса на выполнение
 
    if (p1.player_life == 0 || p1.player_life < 0)      // как только счетчик уровня жизни = 0 или меньше 0
    {
        cout << "\n игра окончена!";                    // выводим сообщение
        return 0;                                       // завершаем игру
    }
}
 
 
system("pause>0");
return 0;
}
То есть, переменную мне использовать нужно, и для этого я открыл к ней общий доступ. Но это плохо потому что , она может быть изменена другим кодом.

В общем я так и не смог решить эту задачу, прошу подсказки если можно!
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.05.2020, 17:01
Цитата Сообщение от R_U_S_V Посмотреть сообщение
прошу подсказки если можно!
Так вам же уже выдали не только подсказки, но и вполне годный вариант исправления вот здесь. Что не так?
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
10.05.2020, 22:27  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Так вам же уже выдали не только подсказки, но и вполне годный вариант исправления вот здесь. Что не так?
Сложный для меня код! Но за потраченное время благодарен...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
10.05.2020, 22:35
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Сложный для меня код!
Но это именно то, что у вас должно получится в результате. Проще не выйдет.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
10.05.2020, 22:43  [ТС]
В методе - void move(int x, int y)
переменные curr_x и curr_y превращаются в просто x, y так и не понял для чего так надо?
функция - update_heart(); вызывается раньше инициализации - void update_heart()

C++
1
2
3
4
5
6
    void move(int x, int y)  // метод отвечает за ввод координат
    {
        curr_x = x;
        curr_y = y;
        update_heart();
    }
В методе bool is_live() насколько я смог понять только одна инструкция и она возвращает положетельное значение, то есть возврат пока - больше нуля. Не уверен что прав.

C++
1
2
3
4
    bool is_live()               // метод отвечает за то жив игрок или нет
    {
        return (m_life > 0);  // возврат если жизнь игрока больше 0, то есть жив
    }
Я напрочь запутался вообще!

Единственное, что я понял, то что в мейне переменные не участвуют, а только методы, но и X Y

Попросил бы понять меня правильно, я никак не пытаюсь очернить код человека! Я просто его пока не понимаю...

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Но это именно то, что у вас должно получится в результате. Проще не выйдет.
Охотно верю! С грустью только...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
10.05.2020, 22:50
Цитата Сообщение от R_U_S_V Посмотреть сообщение
функция - update_heart(); вызывается раньше инициализации - void update_heart()
Какой инициализации?

Цитата Сообщение от R_U_S_V Посмотреть сообщение
В методе bool is_live() насколько я смог понять только одна инструкция и она возвращает положетельное значение, то есть возврат пока - больше нуля.
Она возвращает true или false. Его тело - это логическое выражение. Смысл его вот такой
C++
1
2
3
4
if(m_life > 0) 
    return true 
else 
    return false;
только запись короче.

Цитата Сообщение от R_U_S_V Посмотреть сообщение
так и не понял для чего так надо?
Я же это объяснял выше. В примере про машину и ключ зажигания.
0
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
10.05.2020, 23:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Она возвращает true или false. Его тело - это логическое выражение. Смысл его вот такой
C++Выделить код
1
2
3
4
if(m_life > 0)
    return true
else
    return false;
только запись короче.
Вот так я понимаю)) не дорос я еще до сокращений, дело конечно хорошее, для профи...

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Какой инициализации?
Оговорка! Не инициализации, а определения

Вот здесь вообще не смог понять как функция - update_heart(); может вызываться раньше чем она определена?
Вот часть кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    void move(int x, int y)  // метод отвечает за ввод координат
    {
        curr_x = x;
        curr_y = y;
        update_heart();
    }
    int get_life()
    {
        return m_life;   // возвращаем значение здоровья
    }
    void update_heart()   // метод добавляет/отнимает здоровье/жизнь персонажа
    {
        if (curr_x == 14 && curr_y == -6)
        {
            m_life = m_life + 1;                      // прибавляем 1 деление
            cout << "\n вы взяли зеленое сердечко (+ 1)";
            cout << "\n уровень здоровья = " << m_life;
        }
в 5 строке вызывается, в 11 определяется.

Добавлено через 6 минут
По поводу сокращений!
Вот 2 простых примера m_life = m_life + 1; m_life += 1;
Я предпочту первый, хотя кто работает в команде наверняка меня закидает тапками.
Мне для восприятия проще больше кода, чем более изящный, уж коль язык позволяет. Ну это мое мнение конечно...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
10.05.2020, 23:09
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Вот здесь вообще не смог понять как функция - update_heart(); может вызываться раньше чем она определена?
В классах так делать можно. Потому что в теле класса считается, что класс уже целиком объявлен. Поэтому объявления всех методов (т.к. они часть объявления класса) доступны в любом месте тела класса.

Где находится определение в данном случае не играет роли. Оно может быть как в теле класса, так и снаружи, ключевым является объявление.

Добавлено через 1 минуту
Цитата Сообщение от R_U_S_V Посмотреть сообщение
не дорос я еще до сокращений
Но подобный код в условии, например, цикла вас же не смущает?
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
10.05.2020, 23:11  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В классах так делать можно. Потому что в теле класса считается, что класс уже целиком объявлен.
То есть в ТЕЛЕ {} класса условно можно считать, что чтение кода процессором может происходить как снизу вверх так и наоборот!
Это важный момент вообще. Не знал.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
10.05.2020, 23:13
Цитата Сообщение от R_U_S_V Посмотреть сообщение
То есть в ТЕЛЕ {} класса условно можно считать, что чтение кода процессором может происходить как снизу вверх так и наоборот!
Эм? Чтение кода процессором?

Вообще-то код на С++ никакого отношения к тому как код читается процессором не имеет.
Процессор работает с машинным кодом. Код на С++ - это не машинный код.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
10.05.2020, 23:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Но подобный код в условии, например, цикла вас же не смущает?
Да, нет, я и сам люблю оптимизацию и рациональность, просто мой код каким бы он ни был мне более понятен, чем чужой, каким бы правильным он ни был. А это так, поэтому и позвал Вас.

Иногда переписываю условия в более простой вариант, если код чужой, свой стараюсь писать более понятно. Я с плюсами общаюсь с этого года только, идет медленно...

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Эм? Чтение кода процессором?
Я бинарник имел ввиду, ведь после компиляции процессор читает его. Понятное дело что у компилятора куча своих функций, которые укладывают все по полочкам. И там как раз может все быть ПЕРЕПУТАНО местами, ну как я понимаю этот процесс.

Ну в книгах же пишут, что чтение кода происходит сверху вниз.

Перефразирую. В теле класса не важна последовательность инструкций
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
10.05.2020, 23:21
Цитата Сообщение от R_U_S_V Посмотреть сообщение
после компиляции процессор читает его
Ну и как тогда вы сумели сделать вывод, что
Цитата Сообщение от R_U_S_V Посмотреть сообщение
чтение [C++] кода процессором может происходить как снизу вверх так и наоборот!
?
1
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
10.05.2020, 23:21
Цитата Сообщение от R_U_S_V Посмотреть сообщение
переменные curr_x и curr_y превращаются в просто x, y так и не понял для чего так надо?
Как минимум, чтобы сделать координаты приватными полями и скрыть детали реализации (инкапсуляция). Объект Player достаточно простой, поэтому кажется, что нет никакой разницы писать:
C++
1
2
3
p1.x = new_x;
p1.y = new_y;
p1.update_geart();
или
C++
1
p1.move(new_x, new_y);
Но со временем он может стать гораздо сложнее, и в определенный момент Вы захотите добавить еще какую-то проверку, связанную с перемещением. Например, не упал ли игрок в пропасть. В первом случае придется найти все места, где выполнялось перемещение и дописывать еще что-то вроде p1.check_fall();. В случае с методом move(x,y) такое изменение потребуется сделать всего 1 раз. Это одна из причин (лампа DrOffset'а - пример более наглядный).

По поводу return (m_life > 0); попробую провести аналогию. Вас же не смущает, что можно написать что-то вроде return (m_life + 1);? Вы знаете, что m_life - целое число, оператор + складывает два числа и в результате так же получается число. Аналогично > - тоже оператор, только он выполняет сравнение и возвращает результат типа bool. В данном случае: true если m_life больше 0, false - m_life меньше или равно 0.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
10.05.2020, 23:28  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну и как тогда вы сумели сделать вывод, что
Я снова запутался. Мне сейчас не важно как обрабатывается бинарный код на аппаратном уровне, мне было удивительно узнать, что в теле класса можно не соблюдать привычную последовательность.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
10.05.2020, 23:30
Цитата Сообщение от R_U_S_V Посмотреть сообщение
То есть в ТЕЛЕ {} класса условно можно считать, что чтение кода процессором может происходить как снизу вверх так и наоборот!
На самом деле тут все несколько прозаичнее.

Транслятор может либо два раза прочитать файл, сначала прочитать и запомнить все объявления, затем еще раз прочитать и заняться уже определениями. Либо он может читать его один раз, но в тех местах, где выполняется обращение к члену класса, оставлять метку, которую после завершения трансляции связать с найденным в этом же классе объявлением. Также могут быть и иные варианты. В любом случае это не имеет никакого отношения какой в результате получится машинный код в "бинарнике".

Добавлено через 1 минуту
Цитата Сообщение от R_U_S_V Посмотреть сообщение
было удивительно узнать, что в теле класса можно не соблюдать привычную последовательность.
Да, вам сейчас достаточно просто запомнить, что в теле (!) класса ее можно не соблюдать. Метафизику процесса поймете позже, когда поднаберетесь опыта.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
10.05.2020, 23:43  [ТС]
Цитата Сообщение от valen10 Посмотреть сообщение
Как минимум, чтобы сделать координаты приватными полями и скрыть детали реализации
Я так и понял в целом, но в книге пока про это нет, может не дошел еще просто!

Добавлено через 55 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, вам сейчас достаточно просто запомнить, что в теле (!) класса ее можно не соблюдать.
Это я запомил четко.

Добавлено через 2 минуты
В общем код меня с толку сбил хорошенько, много новых подходов которые предстоит осознать и освоить. Мы сейчас с коллегой приступили к написанию игры, так вот он мне прислал свой код, я вообще потерялся, так 50% инструкций мною не освоено еще! Вот жесть.

Добавлено через 9 минут
Про сокрытие данных в книге есть, а вот про то, что из классовых переменных можно сделать обычные и оперировать ими в мейне, пока не знал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2020, 23:43

Какова вероятность того, что хотя бы 450 поступивших выдержат испытания. Прошу проверить правильность решения
При поступлении в университет вступительные испытания выдерживают в среднем 25% абитуриентов. В приёмную комиссию поступило 1800 заявлений....

Прошу оценить правильность сверстанной формы (HTML, Bootstrap 4)
Товарищи форумчане, прошу сделать жесткую критику по сверстанной мною данной формы ибо её HTML меня пугает. К теме прилагается: скриншот...

Классы, объекты и self
Добрый вечер) Читаю литературу по руби. Разумеется есть вопросы. 1) Есть объект class A def hello puts 'hello world'...

Классы и объекты
Как выполнить следующие задания: 1) Написать класс Round, задающий круг с указанными координатами центра, радиусом, а также свойствами,...

Классы и объекты
Добрый день всем.Хотел узнать кое что,надеюсь вопрос будет соответствовать название темы:) На лабораторной поставили задачу,создать...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru