Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 25.02.2019
Сообщений: 26

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

28.03.2019, 12:14. Показов 3670. Ответов 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
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,245
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru