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

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

28.03.2019, 12:14. Показов 3497. Ответов 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
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru