1 / 1 / 0
Регистрация: 25.02.2019
Сообщений: 26

Работа с классами

28.03.2019, 12:14. Показов 3551. Ответов 25

Студворк — интернет-сервис помощи студентам
Для практики на c++, делаю небольшую игрушку. Возникла проблема с присваиванием класса.
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
// RPG___ForCyberForum.cpp: определяет точку входа для консольного приложения.
//
 
 
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <ctime>
 
using namespace std;
 
void String()
{
    cout << "---------------------------------------------------------------------------------------------" << endl;
}
 
class Heal//Лечебное зелье
{
private:
    string name;
    int restored_health;
public:
    void CreateHeal(string name, int restored_health)
    {
        this->name = name;
        this->restored_health = restored_health;
    }
    string ShowNameMedicine()
    {
        return name;
    }
};
 
class ElementHealBox//"Слот" под зелье
{
public:
    class Heal Medicine;
    ElementHealBox *pNext;
    int number_medicine = 1;
};
 
class ListHealBox//Односвязный список "слотов" с зельями
{
private:
    ElementHealBox *pHead;
    int size = 0;
public:
    ListHealBox() { pHead = nullptr; }
    void Show()
    {
        ElementHealBox *temp = pHead;
        while (temp != NULL)
        {
            cout << temp->Medicine.ShowNameMedicine() << " Количество склянок: " << temp->number_medicine << endl;
            temp = temp->pNext;
        }
        String();
    }
    int Add(Heal AddHeal)
    {
        if (size == 10)
        {
            cout << "Сумка с зельями полна" << endl;
            return 0;
        }
        if (pHead == NULL)//Если список пуст
        {
            ElementHealBox *temp = new ElementHealBox;
            temp->Medicine = AddHeal;
            temp->pNext = pHead;
            pHead = temp;
            size++;
        }
        else if (AddHeal.ShowNameMedicine() != pHead->Medicine.ShowNameMedicine() && pHead->pNext == nullptr)//Если один элемент в списке и не совпадает с добавляемым зельем
        {
            ElementHealBox *temp = new ElementHealBox;
            pHead->pNext = temp;
            temp->Medicine = AddHeal;
            temp->number_medicine = 1;
            temp->pNext = nullptr;
            size++;
        }
        else if (AddHeal.ShowNameMedicine() == pHead->Medicine.ShowNameMedicine() && pHead->pNext == nullptr)//Если один элемент в списке и совпадает с добавляемым зельем 
            pHead->number_medicine++;
        else
        {
            ElementHealBox *current = pHead->pNext;
            while (AddHeal.ShowNameMedicine() != current->Medicine.ShowNameMedicine() && current->pNext != nullptr) //Не один элемент в списке. идём по списку пока не встретим совпадение
                current = current->pNext;
            if (AddHeal.ShowNameMedicine() == current->Medicine.ShowNameMedicine())//Если встретили добавляем 1 зелье
            {
                current->number_medicine++;
            }
            else//если достигли конца, делаем новый слот с добавляемым зельем
            {
                ElementHealBox *temp = new ElementHealBox;
                current->pNext = temp;
                temp->Medicine = AddHeal;
                temp->number_medicine = 1;
                temp->pNext = nullptr;
                size++;
            }
        }
        Show();
        return 0;
    };
    int Delete(Heal DeleteHeal)
    {
        if (pHead->Medicine.ShowNameMedicine() == DeleteHeal.ShowNameMedicine())
        {
            if (pHead->number_medicine > 1)
                pHead->number_medicine--;
            else if (pHead->number_medicine == 1)
            {
                if (pHead->pNext == nullptr)
                {
                    delete pHead;
                    size--;
                }
                else if (pHead->pNext != nullptr)
                {
                    ElementHealBox *current = pHead->pNext;
                    delete pHead;
                    pHead = current;
                    size--;
                }
            }
        }
        else
        {
            ElementHealBox *current = this->pHead;
            while (current->pNext->Medicine.ShowNameMedicine() != DeleteHeal.ShowNameMedicine())
                current = current->pNext;
            if (current->pNext->number_medicine > 1)
                current->pNext->number_medicine--;
            else if (current->pNext->number_medicine == 1 && current->pNext->pNext == nullptr)
            {
                delete current->pNext;
                current->pNext = nullptr;
                size--;
            }
            else if (current->pNext->number_medicine == 1 && current->pNext != nullptr)
            {
                ElementHealBox *current_1 = current;
                current = current->pNext;
                current_1->pNext = current->pNext;
                delete current;
                size--;
            }
        }
        return 0;
    }
    ElementHealBox* operator [](const int number)
    {
        int number_current = 1;
        ElementHealBox *current = pHead;
        while (current != nullptr)
        {
            if (number_current == number)
                return current;
            current = current->pNext;
            number_current++;
        }
    }
 
    ~ListHealBox()
    {
        while (pHead != NULL)
        {
            ElementHealBox *temp = pHead->pNext;
            delete pHead;
            pHead = temp;
        }
    };
 
};
 
class Invertory//Инвертарь
{
public:
    class ListHealBox *MedicineBag;//"Сумка" с зельями
    void CreateInvertory(ListHealBox MedicineBag)
    {
        this->MedicineBag = &MedicineBag;
    }
};
 
class Hero
{
private:
    string name;
    int health = 50;
public:
    class Invertory *InvertoryOfHero;//Инвертарь героя
    void CreateGG(string name, Invertory InvertoryOfHero)
    {
        this->name = name;
        this->InvertoryOfHero = &InvertoryOfHero;
    }
    void SetHealth(int health)
    {
        this->health = health;
    }
    int GetHealth()
    {
        return health;
    }
};
 
void main()
{
    setlocale(LC_ALL, "ru");
    srand(time(0));
    cout << "Доброго времени суток, вы запустили игру *Название*" << endl;
    ///////////////////////////////////////////////////////////////////////////////////////
    Heal SmalHealingPotion, AverageHealingPotion, GreatHealingPotion;
    SmalHealingPotion.CreateHeal("SmalHealingPotion - Малое лечебное зелье", 10);
    AverageHealingPotion.CreateHeal("AverageHealingPotion - Среднее лечебное зелье", 25);
    GreatHealingPotion.CreateHeal("GreatHealingPotion - Большое лечебное зелье", 50);
    ////////////////////////////////////////////////////////////////////////////////////////
    class ListHealBox List;
    List.Add(SmalHealingPotion);
    List.Add(SmalHealingPotion);
    List.Add(AverageHealingPotion);
    List.Add(AverageHealingPotion);
    List.Add(AverageHealingPotion);
    List.Add(GreatHealingPotion);
    List.Show();
    List.Delete(AverageHealingPotion);
    List.Delete(GreatHealingPotion);
    List.Delete(SmalHealingPotion);
    List.Show();
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    class Invertory InvertoryOfGG;
    InvertoryOfGG.CreateInvertory(List);
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
    Hero MyHero;
    cout << "Введите имя вашего героя: ";
 
    string s;
    cin >> s;
    MyHero.CreateGG(s, InvertoryOfGG);
    String();
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    system("pause");
}
По плану у класса человек есть класс инвертарь, который состоит из односвязных списков. Сейчас там представлен один список. Это список с лечебными зельями. В список зелья добавляются-удаляются, всё происходит нормально.
Всё происходит нормально до строки 237 .
После прохождения этой строки(она означает присваивание классу инвертарь класс-список лечебных зелий) сам список меняется. то есть некоторые данные остаётся в нормальном виде, а в некоторых данных и указателях появляется какой-то мусор.
Может кто-нибудь объяснить, как это реализовать правильно или что исправить, чтобы было правильно и как это работает?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.03.2019, 12:14
Ответы с готовыми решениями:

Работа с классами
плиз помогите решить нужно написать функции которыи будут выполнять сложение, вычитание, умножение и деление допустим d1 и d3 вот то...

Работа с классами
Помогите плз Определите значение переменных а, х, с после выполнения следующих команд: class First { int value; public: ...

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

25
 Аватар для dreamer_108
75 / 55 / 21
Регистрация: 10.07.2018
Сообщений: 214
28.03.2019, 16:32
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Андрей Холодов Посмотреть сообщение
И подскажите, как обозначать, что текст "не по теме"?
Кнопка OFF в редакторе, сам долго искал)

Добавлено через 1 минуту
Цитата Сообщение от Андрей Холодов Посмотреть сообщение
Вот есть класс инвертарь, в котором в последующем должны быть несколько списков
Да, нормально
Цитата Сообщение от Андрей Холодов Посмотреть сообщение
Допустим список на оружие, которое имеет персонаж, список на медикаменты, список на элементы брони, которые персонаж может носить на себе
А вот этого можно избежать, используя наследование - пусть список хранит некие базовые объекты, типа "Предмет", так ведь удобнее
1
1 / 1 / 0
Регистрация: 25.02.2019
Сообщений: 26
28.03.2019, 16:49  [ТС]
dreamer_108,
Сейчас я просто смотрю большой курс видеооуроков по c++.

Не по теме:

у #SimpleCode если что

. Все знания оттуда стараюсь применять на практике. Т.к. сейчас там начались уроки по ООП, соответственно я пытаюсь в своей игре реализовывать все знания, которые получаю из уроков.

Не по теме:

А вообще собираюсь досмотреть эти уроки, разобраться немного в программировании в целом и перейти на какой-нибудь другой язык. Мб Kotlin.


Возвращаясь к решению проблемы. Не могли бы вы подробней описать тему с базовыми объектами? Просто не могу понять ,каким образом тогда разделять предметы на те же медикаменты , оружие и тд...
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.03.2019, 17:03
Цитата Сообщение от Андрей Холодов Посмотреть сообщение
Просто не могу понять ,каким образом тогда разделять предметы на те же медикаменты , оружие и тд...
Делаете один базовый класс, а всякие зелья, оружие и т.д. - это некий stuff, который можно подобрать себе в инвентарь или выбросить (это их свойства, которые могут быть унаследованы от базового класса).
1
Just Do It!
 Аватар для XLAT
4220 / 2683 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
28.03.2019, 18:38
Лучший ответ Сообщение было отмечено Андрей Холодов как решение

Решение

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

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
class A {
   public:
     virtual void use() = 0;
}
 
class Gun: A{
   public:
     void use() {};
}
 
class Medicine: A{
   public:
     void use() {};
}
 
A * a[2];
a[0] = new Gun();
a[1] = new Medicine();
 
A* cell; ячейка инвентаря.
 
cell = a[0];
cell->use(); // здесь будет вызываться метод класса Gun
 
cell = a[1];
cell->use(); // здесь будет вызываться метод класса Medicine
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.03.2019, 19:30
Лучший ответ Сообщение было отмечено Андрей Холодов как решение

Решение

Андрей Холодов, вот еще немного подправленная версия того что я набросал на скорую руку (т.к. на работе еще) и того что вам в ЛС кидал, но еще раз, что бы оно работало корректно надо разбить на хедеры, т.к. тут некая пародия на дабл-диспатч
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <vector>
#include <string>
 
struct stuff {
protected:
    std::string type_;
    stuff(std::string const& type) noexcept : type_(type) {}
    virtual ~stuff() {}
public:    
    std::string type() const noexcept { return type_; }
    virtual void pickup(struct human* const) const noexcept = 0;
    virtual void drop(struct human* const) const noexcept = 0;
};
 
struct potion : stuff {
    potion() noexcept : stuff("potion") {}
    
    void pickup(struct human* const hero) const noexcept override {
        std::printf("Picked up potion\n");
        // hero->inventory_->add(this);
    }
    void drop(struct human* const hero) const noexcept override {
        std::printf("Droped down potion\n");
        // hero->inventory_->remove(this);
    }
};
 
struct weapon : stuff {
    weapon() noexcept : stuff("weapon") {}
    
    void pickup(struct human* const human) const noexcept override {
        std::printf("Picked up weapon\n");
        // human->inventory_->add(this);
    }
    void drop(struct human* const human) const noexcept override {
        std::printf("Droped down weapon\n");
        // human->inventory_->remove(this);
    }
};
 
struct human {
    struct inventory {
        std::vector<stuff*> quantity_;
    
        void add(stuff* const stuff) noexcept {
            quantity_.push_back(stuff);
        }
        void remove(stuff* const stuff) noexcept {
            quantity_.erase(quantity_.end() - 1);
        }
    } inventory_;
    
    void explore(stuff* const stuff) noexcept {
        std::printf("You find new stuff: %s\nDo you want to pick up it? (Y/N)\n", stuff->type().c_str());
        char result;
        std::scanf(" %c", &result);
        if (result == 'Y') {
            stuff->pickup(this);
        }
    }    
};
 
int main() {
    human new_hero;
    
    std::vector<stuff*> stuff_in_range; 
    stuff_in_range.push_back(new potion);
    stuff_in_range.push_back(new weapon);
 
    for (auto&& stuff : stuff_in_range) {
        new_hero.explore(stuff);
    }
}
Пример вывода:
Code
1
2
3
4
5
6
You find new stuff: potion
Do you want to pick up it? (Y/N) Y
Picked up potion
You find new stuff: weapon
Do you want to pick up it? (Y/N) Y
Picked up weapon

И да это не лучшее решение, т.к. я не думал о многих ньюансах, но для обучения думаю должно быть норм.
1
1 / 1 / 0
Регистрация: 25.02.2019
Сообщений: 26
28.03.2019, 20:16  [ТС]
dreamer_108, Azazel-San, XLAT, dreamer_108,
Спасибо вам всем за помощь и отзывчивость, а то чуть было не разочаровался в людях на этом форуме)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2019, 20:16

Работа с классами
Задача:найти сумму всех отрицательных элементов матрицы и записать в вектор. For (i=0;i&lt;=N;i++) for (j=0;j&lt;=M;j++) if (a&lt;0) ...

Работа с классами
Добрый день, помогите написать программу которая создаёт класс Bool – логические переменные. Определить операторы &quot;+&quot; –...

Работа с классами в С++
Доброго всем дня.У меня возникла проблема с освоением языка C++ , сейчас пишу курсовую на этом языке, и ещё не совсем всё понимаю, но книги...

Работа с классами
Помогите пожалуйста написать программу. Задан массив действительных чисел. Найти количество элементов, значение которых меньше...

Работа с классами
Привет всем!!!!! Пацаны помогите написать программу плиз, на завтро нужно!!!!! Тема: Классы Задание:Описати інтерфейс та реалізувати...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
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). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru