3 / 2 / 1
Регистрация: 14.10.2012
Сообщений: 50
1

Объекты классов не видны во вложенной функции одной из классов

06.07.2018, 19:48. Показов 1182. Ответов 1
Метки нет (Все метки)

Такая вот проблема. Есть функция play() класса Game, где создаются объекты классов Game, Character, Battle. В ней я обращаюсь к еще одной функции класса Game roadjourney, указываю в ней объекты классов в качестве параметров, но дальше в этой функции не могу получить доступ к переменным этих объектов. При этом в самой функции play() я нормально получаю доступ к переменными классов (строки 92 и 94, например). Ошибка компиляции пишет:
error: 'p' was not declared in this scope
Это на 100 строке. Если закоментировать, то компилируется нормально. Для краткости привел лишь часть кода (работающий с неработающей 100 строке):
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
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <ctime>
#include <vector>
#include <windows.h>
#include <locale.h>
#include <sstream>
#include <iomanip>
#include <limits>
#ifdef _WIN32
#define CLEAR "cls"
#else //In any other OS
#define CLEAR "clear"
#endif
using namespace std;
void ClearScreen();
class Character;
class Battle;
class Game {
public:
string gamelogs;
string gamelogstats;
vector <string> gamelog;
void play();
void roadjourney(Battle &, Character &, Character &);
void bardisplay(Character &, Character &);
void bardisplay(Character &);
void osstostring( std::ostream& s );
void osstostring2( std::ostream& s );
void showgamelogs();
};
 
void Game::osstostring( std::ostream& s ) {    gamelogs += dynamic_cast<std::ostringstream&>(s).str();  }
void Game::osstostring2( std::ostream& s ) {    gamelogstats += dynamic_cast<std::ostringstream&>(s).str();  }
void Game::showgamelogs()
{
    cout << gamelogstats << gamelogs;
}
class Character : public Game {
public:
double accuraty;
double agility;
double endurance;
int hitpoints;
int experience;
int level;
double speed;
double strength;
int distance;
string object;
Character (string o) : object(o)
{
    cout << "Создался объект " << object << endl;
}
~Character()
{
    cout << "Разрушился объект " << object << " с хр " << hitpoints << endl;
}
void generatecharacter();
void levelingcharacter();
};
class Battle : public Game {
private:
public:
 string object;
 Battle (string o) : object(o)
{
    cout << "Создался объект " << object << endl;
}
 ~Battle()
{
    cout << "Разрушился объект " << object << endl;
}
void callopponent(Game *,Character &, Character &);
void battlelogic(Character &, Character &);
void battledistance(Character &, Character &);
void battlehit(Character &, Character &);
void battledamage(Character &, Character &);
void surrendlogic(Character &, Character &);
void opponentTurn(Character &, Character &);
};
 
void Game::play()
{
    Character p("Player");
    p.generatecharacter();
    Battle b("Battle");
    Character o("Oppo");
    while (p.hitpoints > 0)
    {
        cout << b.object << " " << p.object << " " << o.object;
        roadjourney(b, p, o);
        cout << b.object << " " << p.object << " " << o.object;
    }
}
 
void Game::roadjourney(Battle &, Character &, Character &)
{
    cout << p.object << endl;
    int n;
    cin >> n;
//    int fate = (rand() % 3) + 1;
//    switch (fate)
//    {
//    case 1:
//        b.callopponent(this, p, o);
//        break;
//    case 2:
//        cout << "Вы ходите дальше" << endl;
//        break;
//    case 3:
//        cout << "Вы находите сокровище" << endl;
//        break;
//    }
}
 
void Character::generatecharacter()
{
    hitpoints = 100;
    for (int c = 0; c < 30; ++c)
    {
    int ch = (rand() % 5) + 1;
    switch (ch)
    {
    case 1:
    strength += 1;
    break;
    case 2:
    agility += 1;
    break;
    case 3:
    speed += 1;
    break;
    case 4:
    accuraty += 1;
    break;
    case 5:
    endurance += 1;
    }
    }
}
 
int main()
{
   setlocale(LC_ALL,"Rus");
   srand(time(0));
   Game game;
   game.play();
}
Не могу понять как исправить. Только осваиваю C++.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2018, 19:48
Ответы с готовыми решениями:

Преобразования объектов классов в объекты других классов
Задача типа обмен валют. Нужно конвертировать старый фунт стерлинг(фунт, шиллинг и пенсы) в доллары...

Виртуальные функции (создать массив указателей на объекты трех классов)
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не...

Controls не видны из классов?
Собственно, есть приложение и есть класс. Прописываем в классе using...

Настройка стилей для вложенной таблицы без использования классов
Имеется таблица (&lt;table&gt;) с определенным стилем x. В ней должна быть вложенная таблица со стилем...

1
Модератор
Эксперт С++
12080 / 9759 / 5902
Регистрация: 18.12.2011
Сообщений: 26,196
06.07.2018, 20:36 2
Лучший ответ Сообщение было отмечено Рольф как решение

Решение

p - Это локальная переменная, объявленная в функции play:
Цитата Сообщение от Рольф Посмотреть сообщение
C++
1
2
3
4
void Game::play() 
{ 
      Character p("Player");
...
соответственно:
C++
1
2
3
void Game::roadjourney(Battle &, Character &, Character &)
{
    cout << p.object << endl;
тут p не видна.
Исправить
C++
1
void Game::roadjourney(Battle &, Character & p, Character &)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2018, 20:36
Помогаю со студенческими работами здесь

С помошью одной функции посчитать результат для двух классов
//С помощью функции friend obrab подсчитать сумму матрицы и массива. Ошибки выдаёт не опйму почему....

Почему в приведенном коде переменные видны для всех классов?
Сегодня объяснял классы сыну. И наткнулся на следующее (и в WDE и в IDE). Почему этот код работает?...

Как в библиотеке классов сделать так, чтобы внутри библиотеки были видны Button
Есть код: using System; using System.Collections.Generic; using System.ComponentModel; using...

Объекты и экземпляры классов
Здравствуйте, я читаю книгу &quot;Изучаем C#&quot; 3-e издание, Эндрю Стиллмена и Дженнифер Грина, так же...


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

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

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