Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 24.07.2017
Сообщений: 6

Один класс не видит другой класс

24.07.2017, 11:22. Показов 6297. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не компилируется код, компилятор выдает ошибку, как я понял это из-за того что я использую в первом классе, второй класс который идет после и компилятор его просто не видит. Я полный нуб, смотрел видео уроки на ютуб, так там спикер говорит что достаточно вначале прописать названия классов и компилятор все поймет. Но у меня не получается (использую virtual studio 2017). Смотрел похожие темы на этом форуме но к сожалению ничего не понял (я нуб). Может кто нибудь сможет доходчиво объяснить как исправить эту ошибку и заставить классы взаимодействовать.
Выкладываю свой код:
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
//header.h
#pragma once
#include <iostream>
#include <clocale>
 
using namespace std;
class knight;
class skeleton;
 
class skeleton {
    
public:
    int health = 100;
 
    void strike(knight &s) {
        s.health -= 20;
        cout << "Skeleton damaged you, your health is " << s.health << endl;
        if (s.health <= 0)
            cout << "You are dead!" << endl;
    }
 
    void heal(skeleton &s) {
        s.health += 20;
        cout << "Enemy healed himself, his health is " << s.health << endl;
    }
};
class knight {
 
public:
    int health = 100;
    void strike(skeleton &s) {
        s.health -= 20;
        cout << "You hit Skeleton, its health is " << s.health << endl;
        if (s.health <= 0)
            cout << "Enemy is killed!" << endl;
    }
    void combo(skeleton &s) {
        s.health -= 40;
        cout << "You hit Skeleton, its health is " << s.health << endl;
        if (s.health <= 0)
            cout << "Enemy is killed!" << endl;
    }
    void heal(knight &k) {
        k.health += 20;
        cout << "You healed yourself, your health is " << k.health << endl;
    }
};
 
//source.ccp
#include <iostream>
#include <clocale>
#include "Header.h"
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
 
    skeleton enemy;
    knight player;
 
    player.strike(enemy);
    player.combo(enemy);
    enemy.strike(player);
    enemy.heal(enemy);
    player.heal(player);
    
 
    
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2017, 11:22
Ответы с готовыми решениями:

Область видимости. один класс не видит другой класс
Добрый день! такая проблема. Есть базовый класс Q. От него наследуется 2 класса Р и G. Класс P имеет два конструктора 1 принимает...

один класс не видит другой
Есть два класса class Second; class First{ friend class Second; public: Second scnd; } class Second{ private:

Один класс не видит другой
class apple; class human { public: int age; apple green; }; class apple

8
4 / 4 / 3
Регистрация: 27.11.2016
Сообщений: 59
24.07.2017, 11:32
Можно по-подробнее об ошибке? Что пишет компилятор? В какой строчке ошибка?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
24.07.2017, 12:03
Цитата Сообщение от ghostx3kto Посмотреть сообщение
//header.h
в заголовке должны местится только описание классов и методов, а их реализация должны быть описана в header.cpp
C++
1
2
3
4
5
6
7
8
9
10
//пример
// есть foo.h - заголовочный файл
void foo(int); // он имеет описание ф-и
 
//foo.cpp - реализация ф-и описаной в заголовке
#include"foo.h"
void foo(int i)
{
    cout << i << endl;
}
и да, интересно бы узнать где и что за ошибка случилась?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
24.07.2017, 12:29
Методы, описанные в классах, не используют данные класса АБСОЛЮТНО.
их НЕЗАЧЕМ делать членами класса.
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
#include <iostream>
#include <clocale>
 
using namespace std;
 
struct skeleton {
    int health;
};
struct knight {
    int health;
};
 
void strike(knight &s) {
        s.health -= 20;
        cout << "Skeleton damaged you, your health is " << s.health << endl;
        if (s.health <= 0)
            cout << "You are dead!" << endl;
    }
 
    void heal(skeleton &s) {
        s.health += 20;
        cout << "Enemy healed himself, his health is " << s.health << endl;
    }
    void strike(skeleton &s) {
        s.health -= 20;
        cout << "You hit Skeleton, its health is " << s.health << endl;
        if (s.health <= 0)
            cout << "Enemy is killed!" << endl;
    }
    void combo(skeleton &s) {
        s.health -= 40;
        cout << "You hit Skeleton, its health is " << s.health << endl;
        if (s.health <= 0)
            cout << "Enemy is killed!" << endl;
    }
    void heal(knight &k) {
        k.health += 20;
        cout << "You healed yourself, your health is " << k.health << endl;
    }
 
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
 
    skeleton enemy;
    knight player;
 
    strike(enemy);
    combo(enemy);
    strike(player);
    heal(enemy);
    heal(player);
    
    system("pause");
    return 0;
}
1
0 / 0 / 0
Регистрация: 24.07.2017
Сообщений: 6
24.07.2017, 16:32  [ТС]
zss,
Спасибо, да, я понял что подобное можно описать и без использования класса. Меня вообще в целом интересует возможно такого рода взаимодействия между классами (например сделать мини игру наподобие той что я написал), или все таки нет?
Дело в том что я смотрел урок на ютуб (про дружественные классы), в нем был как раз похожий пример где объект второго класса "бил" объект первого класса. Так вот, я решил немного расширить пример и добавил объекту первого класса возможность бить объект второго класса. И получил ошибку: С2027: Использование неопределенного типа "Knight".
(Кстати если убрать метод strike у класса skeleton, все будет работать).

Azazel-San,
в заголовке должны местится только описание классов и методов, а их реализация должны быть описана в header.cpp
Но ведь это ничего не изменит, компилятор все равно ведь будет просматривать код сверху вниз.
Ошибка С2027: Использование неопределенного типа "Knight".
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
24.07.2017, 17:51
ghostx3kto, а попробовать?
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
24.07.2017, 18:25
Лучший ответ Сообщение было отмечено ghostx3kto как решение

Решение

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
#pragma once
#include <iostream>
#include <clocale>
 
using namespace std;
 
class knight;
class skeleton;
 
class skeleton
{
 
public:
    int health = 100;
    void strike(knight &s);
    void heal(skeleton &s);
 
};
 
class knight
{
 
public:
    int health = 100;
    void strike(skeleton &s);
    void combo(skeleton &s);
    void heal(knight &k);
 
};
 
void skeleton::strike(knight &s){
    s.health -= 20;
    cout << "Skeleton damaged you, your health is " << s.health << endl;
    if (s.health <= 0)
        cout << "You are dead!" << endl;
}
 
void skeleton::heal(skeleton &s){
    s.health += 20;
    cout << "Enemy healed himself, his health is " << s.health << endl;
}
 
 
 
 
void knight::strike(skeleton &s){
    s.health -= 20;
    cout << "You hit Skeleton, its health is " << s.health << endl;
    if (s.health <= 0)
        cout << "Enemy is killed!" << endl;
}
 
void knight::combo(skeleton &s){
    s.health -= 40;
    cout << "You hit Skeleton, its health is " << s.health << endl;
    if (s.health <= 0)
        cout << "Enemy is killed!" << endl;
}
void knight::heal(knight &k){
    k.health += 20;
    cout << "You healed yourself, your health is " << k.health << endl;
}
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.07.2017, 22:57
Цитата Сообщение от ghostx3kto Посмотреть сообщение
Но ведь это ничего не изменит
Ещё как может изменить.
0
0 / 0 / 0
Регистрация: 24.07.2017
Сообщений: 6
25.07.2017, 12:54  [ТС]
Спасибо всем, разобрался наконец то, можно двигаться дальше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2017, 12:54
Помогаю со студенческими работами здесь

Один класс не видит другой
Есть 2 класса, унаследованные от общего родителя. Один из классов-потомков не видит второй, объявленный ниже. Попытки обвиться его...

Один класс не видит другой. Преобразование класса
Всем доброго времени суток. В общем вот есть такой код: #include &lt;cmath&gt; using namespace std; class Decart; class Polar { ...

Класс создающий другой класс (ошибка)
Начал писать прогу, суть в том, что один класс должен создавать группу объектов другого класса, написал один класс - работало, а во втором...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

"Обернуть" один класс в другой
Добра вам! Так получилось, что пишу на С и ассемблере и вдруг понадобилось небольшая прога на Qt/C++ Суть вот в чём. Есть класс для...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru