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

Как исправить ошибку "использование неопределенного типа Worker"?

30.05.2022, 00:00. Показов 743. Ответов 7
Метки нет (Все метки)

При попытке создания вектора из объектов типа "муравей" возникает некоторая ошибка, пофиксить которую не удается. Ругается на 72 и 76 строки.
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
#pragma once
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Pile
{
public:
    int branch_cnt;
    int leaf_cnt;
    int rock_cnt;
    int dewdrop_cnt;
    Pile();
    Pile(int branch_cnt, int leaf_cnt, int rock_cnt, int dewdrop_cnt);
    void info();
 
};
 
void Pile::info()
{
    cout << "Количество веток = " << branch_cnt << "\tКоличество листов = " << leaf_cnt << "\tКоличество камней = " << rock_cnt << "\tКоличество росинок = " << dewdrop_cnt << endl;
}
 
Pile::Pile() {
    branch_cnt = 0;
    leaf_cnt = 0;
    rock_cnt = 0;
    dewdrop_cnt = 0;
}
Pile::Pile(int branch_cnt, int leaf_cnt, int rock_cnt, int dewdrop_cnt) {
    this->branch_cnt = branch_cnt;
    this->rock_cnt = rock_cnt;
    this->leaf_cnt = leaf_cnt;
    this->dewdrop_cnt = dewdrop_cnt;
}
 
class Warrior;
class Worker;
class Ant;
class Colony :
    public Pile
{
private:
 
public:
    friend Ant;
    friend Warrior;
    friend Worker;
    vector<Ant>* population = new vector<Ant>;
    string colony_name;
    int worker_unit_cnt;
    int warrior_unit_cnt;
    int special_unit_cnt;
    Colony() {
 
        worker_unit_cnt = 0;
        warrior_unit_cnt = 0;
        special_unit_cnt = 0;
        branch_cnt = 0;
        leaf_cnt = 0;
        rock_cnt = 0;
        dewdrop_cnt = 0;
    }
    Colony(string colony_name, int worker_unit_cnt, int warrior_unit_cnt, int special_unit_cnt) {
        this->colony_name = colony_name;
        this->worker_unit_cnt = worker_unit_cnt;
        this->warrior_unit_cnt = warrior_unit_cnt;
        this->special_unit_cnt = special_unit_cnt;
        
        for (int i = 0; i < worker_unit_cnt; i++)
        {
            population[i].push_back(Worker("старший", 15, 2));
        }
        for (int i = 0; i < warrior_unit_cnt; i++)
        {
            population[i].push_back(Warrior("сильный", 15, 2, 15));
        }
        
    }
    ~Colony() {
        delete[] population;
    }
};
 
class Ant :
    public Colony
{
 
public:
    friend Warrior;
    friend Worker;
    string prefix;
    string type;
    int hp;
    int armor;
    int damage;
    Ant() {
 
    }
    Ant(string prefix, string type, int hp, int armor, int damage)
    {
        this->prefix = prefix;
        this->type = type;
        this->hp = hp;
        this->armor = armor;
        this->damage = damage;
 
    }
    void info()
    {
        cout << "Я " << prefix << type << " cейчас у меня " << hp << " единиц здоровья" << endl;
    }
    void info_queen() {
 
    }
    int beat(Ant& attacked1)
    {
        if (attacked1.prefix.find("неряшливый")) attacked1.armor /= 2;
        if (attacked1.type == "Рабочий") attacked1.hp = 0;
        else if (attacked1.armor < this->damage) attacked1.hp = attacked1.hp + attacked1.armor - this->damage;
 
        return attacked1.hp;
    }
 
};
 
 
 
 
class Queen :
    public Ant
{
private:
    string name;
    int min_grow_days;
    int max_grow_days;
    int min_crt_queens;
    int max_crt_queens;
public:
 
    Queen() {
 
    }
    Queen(string name, int min_grow_days, int max_grow_days, int min_crt_queens, int max_crt_queens, int hp, int armor, int damage)
    {
        this->name = name;
        this->max_crt_queens = max_crt_queens;
        this->min_crt_queens = min_crt_queens;
        this->max_grow_days = max_grow_days;
        this->min_grow_days = min_grow_days;
        this->hp = hp;
        this->armor = armor;
        this->damage = damage;
    }
    void grow() {
 
    }
 
};
 
 
 
 
class Warrior :
    public Ant
{
public:
    Warrior() {
 
    }
    Warrior(string prefix, int hp, int armor, int damage) {
        this->hp = hp;
        this->armor = armor;
        this->damage = damage;
    }
 
    int beat_two_obj(Ant& attacked1, Ant& attacked2)
    {
        if (attacked1.prefix.find("неряшливый")) attacked1.armor /= 2;
        if (attacked2.prefix.find("неряшливый")) attacked2.armor /= 2;
        if (attacked1.type == "Рабочий" and attacked2.type == "Рабочий") attacked1.hp = attacked2.hp = 0;
        if (attacked1.type == "Рабочий" and attacked2.type != "Рабочий") {
            attacked1.hp = 0;
            attacked2.hp = attacked2.hp + attacked2.armor - this->damage;
        }
        if (attacked1.type != "Рабочий" and attacked2.type == "Рабочий") {
            attacked2.hp = 0;
            attacked1.hp = attacked1.hp + attacked1.armor - this->damage;
        }
        if (attacked1.type != "Рабочий" and attacked2.type != "Рабочий") {
            attacked1.hp = attacked1.hp + attacked1.armor - this->damage;
            attacked2.hp = attacked2.hp + attacked2.armor - this->damage;
        }
        return attacked1.hp, attacked2.hp;
    }
    int beat_two_obj_dd(Ant& attacked1, Ant& attacked2) {
        {
            if (attacked1.prefix.find("неряшливый")) attacked1.armor /= 2;
            if (attacked2.prefix.find("неряшливый")) attacked2.armor /= 2;
            if (attacked1.type == "Рабочий" and attacked2.type == "Рабочий") attacked1.hp = attacked2.hp = 0;
            if (attacked1.type == "Рабочий" and attacked2.type != "Рабочий") {
                attacked1.hp = 0;
                attacked2.hp = attacked2.hp + attacked2.armor - this->damage * 2;
            }
            if (attacked1.type != "Рабочий" and attacked2.type == "Рабочий") {
                attacked2.hp = 0;
                attacked1.hp = attacked1.hp + attacked1.armor - this->damage * 2;
            }
            if (attacked1.type != "Рабочий" and attacked2.type != "Рабочий") {
                attacked1.hp = attacked1.hp + attacked1.armor - this->damage * 2;
                attacked2.hp = attacked2.hp + attacked2.armor - this->damage * 2;
            }
            return attacked1.hp, attacked2.hp;
        }
    }
    int beat_three_obj(Ant& attacked1, Ant& attacked2, Ant& attacked3) {
        {
            if (attacked1.prefix.find("неряшливый")) attacked1.armor /= 2;
            if (attacked2.prefix.find("неряшливый")) attacked2.armor /= 2;
            if (attacked3.prefix.find("неряшливый")) attacked3.armor /= 2;
 
 
            return 0;
 
        }
    }
};
 
 
 
 
 
class Worker :
    public Ant
{
private:
 
public:
    int branchtake;
    int leaftake;
    int dewdroptake;
    int rocktake;
    Worker() {
        branchtake = 1;
        leaftake = 1;
        dewdroptake = 1;
        rocktake = 1;
        int a = rand() % 6;
        switch (a)
        {
        case 1:
            this->prefix = " легендарный сильный";
            break;
        case 2:
            this->prefix = "старший";
            break;
        case 3:
            this->prefix = "продвинутый";
            break;
        case 4:
            this->prefix = "старший забывчивый";
            break;
        case 5:
            this->prefix = "обычный";
            break;
        case 6:
            this->prefix = "старший капризный";
            break;
        }
    }
 
    Worker(string prefix, int hp, int armor) : Ant(prefix, "Рабочий", hp, armor, 0)
    {
        this->hp = hp;
        this->armor = armor;
        branchtake = 1;
        leaftake = 1;
        dewdroptake = 1;
        rocktake = 1;
 
    }
    void senjor_res_gath(Pile& takefrom, Colony& takewhere) {
    }
 
};
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2022, 00:00
Ответы с готовыми решениями:

Использование неопределенного типа "parent_work"/"parent_net"
Пытаюсь создать глобальные переменные parent *net_module = new parent_net(); parent *work_module...

Как исправить ошибку: Значение типа "const char *" нельзя присвоить сущности типа "char *"?
#include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; struct Car_Specifications {...

Использование неопределенного типа "TComplex"
Здраствуйте! Помогите розобраться, а то уже 3 день сижу. У меня есть абстрактный клас Complex :...

Использование неопределенного типа "тип"
выдает ошибку с2027 и с2227 на строки 3, 8, 9 и 12, я понимаю что не нравиться, но не знаю что...

Исправить ошибку:error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
Скажите пожалуйста, как исправить error C2678: бинарный &quot;&gt;&gt;&quot;: не найден оператор, принимающий...

7
3977 / 2029 / 730
Регистрация: 29.11.2010
Сообщений: 4,356
30.05.2022, 09:28 2
Лучший ответ Сообщение было отмечено sayan1488 как решение

Решение

Цитата Сообщение от sayan1488 Посмотреть сообщение
class Ant :
    public Colony
Муравей является колонией, которая состоит из муравьев?
Рекурсивный муравей...
Уберите это наследование.
Цитата Сообщение от sayan1488 Посмотреть сообщение
friend Warrior;
    friend Worker;
лишние связывания. Уберите.
Цитата Сообщение от sayan1488 Посмотреть сообщение
class Warrior;
class Worker;
class Ant;
Лишнее. Поместите сюда сами классы.

Цитата Сообщение от sayan1488 Посмотреть сообщение
void senjor_res_gath(Pile& takefrom, Colony& takewhere) {
    }
Это вообще что? И зачем это тут?
1
438 / 281 / 183
Регистрация: 23.06.2018
Сообщений: 650
30.05.2022, 09:48 3
Про ошибку: это значит что пора бы разделить это всё на файлы, объявления классов и их методов в .h, реализацию методов в .cpp... Ну или просто вынести реализацию проблемного конструктора после определения используемого класса.
И ещё два замечания:
1. Не вижу ни одного виртуального метода, следовательно dynamic_cast работать не будет. Как вы собираетесь определять какой именно подкласс вы храните?
2.
Цитата Сообщение от sayan1488 Посмотреть сообщение
vector<Ant>* population = new vector<Ant>;
...
population[i].push_back(Worker("старший", 15, 2));
...
delete[] population;
Вы создали один единственный вектор, должно быть delete population и population->push_back(...). И зачем вы вообще его храните через указатель? Гораздо проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
vector<Ant> population;
//...
for (int i = 0; i < worker_unit_cnt; i++)
{
    population.push_back(Worker("старший", 15, 2));
}
for (int i = 0; i < warrior_unit_cnt; i++)
{
    population.push_back(Warrior("сильный", 15, 2, 15));
}
//...
~Colony() {}
1
1 / 1 / 0
Регистрация: 28.05.2022
Сообщений: 12
30.05.2022, 10:27  [ТС] 4
Эта ошибка была еще когда все классы и методы были разделены файлами, мне посоветовали все классы в один хедер засунуть, чтобы не морочиться с рекурсией классов. По виртуальным методам понял, а вот через указатель я делаю для будущего простого обращения к элементам вектора в будущих методах. Решение, которое вы предложили не убрало проблему, но, все равно, благодарю за уделенное время

Добавлено через 3 минуты
[QUOTE=lemegeton;16270548]
Рекомендации выполнил, к сожалению, все также неопределенный тип класса
Про метод, в себе ничего не содержащий, в будущем там будет определенная логика и пока это просто скелет.
0
С чаем беда...
Эксперт CЭксперт С++
10007 / 5353 / 1467
Регистрация: 18.10.2014
Сообщений: 12,899
30.05.2022, 10:29 5
Цитата Сообщение от sayan1488 Посмотреть сообщение
Решение, которое вы предложили не убрало проблему, но, все равно, благодарю за уделенное время
Не ясно, к кому именно вы обращаетесь, но тем не менее вы не ответили на заданный выше вопрос: зачем класс Ant у вас наследуется от класса Colony? В чем идея такого загадочного дизайна?

С этого надо начинать.
0
1 / 1 / 0
Регистрация: 28.05.2022
Сообщений: 12
30.05.2022, 10:40  [ТС] 6
TheCalligrapher
Уже понял, что незачем наследовать колонию муравью.
По поводу обращения, что-то догнать не могу, как здесь устроен аппарат создания сообщения

теперь понял
0
438 / 281 / 183
Регистрация: 23.06.2018
Сообщений: 650
30.05.2022, 10:44 7
Цитата Сообщение от sayan1488 Посмотреть сообщение
через указатель я делаю для будущего простого обращения к элементам вектора в будущих методах
А чем упростит? Не скажу что (*population)[i] или population->at(i) лучшем чем population[i]. Даже медленнее за счёт разыменовывания.
Цитата Сообщение от sayan1488 Посмотреть сообщение
посоветовали все классы в один хедер засунуть, чтобы не морочиться с рекурсией классов
Мде, ну тогда либо в классе оставьте только прототип Colony(string colony_name, int worker_unit_cnt, int warrior_unit_cnt, int special_unit_cnt);, а определение вынесите в конец файла, либо как выше рекомендовали, переместите все классы муравьёв выше класса колонии.
1
1 / 1 / 0
Регистрация: 28.05.2022
Сообщений: 12
30.05.2022, 11:05  [ТС] 8
Цитата Сообщение от Bleach163 Посмотреть сообщение
А чем упростит? Не скажу что (*population)[i] или population->at(i) лучшем чем population[i]. Даже медленнее за счёт разыменовывания.
без указателя и разыменования появляется больше ошибок, поэтому проще пойти по пути меньшего сопротивления.
Перенос классов юнитов выше колонии решил проблему. Всем спасибо
Bleach163
lemegeton
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2022, 11:05
Помогаю со студенческими работами здесь

Как исправить ошибку "const char* несовместим с параметром типа LPSTR"
Должно выводить переменную окружения в дочерний вопрос, но жалуется на cmd. Говорит, что аргумент...

Компилятор выдаёт ошибку: error C2011: Confection::Date: переопределение типа "struct". Как исправить?
#pragma once #pragma warning #ifndef Confection_H #define Confection_H #include &lt;string&gt;...

Каким образом исправить ошибку "'Tree' не является именем типа"
Tree* Make(Tree* Root) { Tree* Prev, *t; int b, find; if (Root == NULL) { ...

Исправить ошибку error C2562: функция типа "void", возвращающая значение
Выдает ошибку error C2562: tabl: функция типа &quot;void&quot;, возвращающая значение. #include &lt;iostream&gt;...

Исправить ошибку "не найден оператор, принимающий левый операнд типа 'node'"
Ошибка: &quot;бинарный &quot;==&quot;: не найден оператор, принимающий левый операнд типа &quot;node&quot; (или приемлемое...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru