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

Про доступ к данным класса

20.04.2020, 12:58. Показов 942. Ответов 3

Всем добрый день! Вот изучаю плюсы и хотел бы разобраться в следующем.
Пока достаточно плохое понимание классов вот приведу урок из туториала.
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
#include <iostream> 
#include <ctime> // для time()
#include <cstdlib> // для rand() и srand()
#include <string>
 
class Monster
{
public:
    enum MonsterType
    {
        Dragon,
        Goblin,
        Ogre,
        Orc,
        Skeleton,
        Troll,
        Vampire,
        Zombie,
        MAX_MONSTER_TYPES
    };
 
private:
 
    MonsterType m_type;
    std::string m_name;
    int m_health;
 
public:
    Monster(MonsterType type, std::string name, int health)
        : m_type(type), m_name(name), m_health(health)
    {
 
    }
 
    std::string getTypeString() const
    {
        switch (m_type)
        {
        case Dragon: return "dragon";
        case Goblin: return "goblin";
        case Ogre: return "ogre";
        case Orc: return "orc";
        case Skeleton: return "skeleton";
        case Troll: return "troll";
        case Vampire: return "vampire";
        case Zombie: return "zombie";
        }
    
        return "Error!";
    }
 
    void print() const
    {
        std::cout << m_name << " is the " << getTypeString() << " that has " << m_health << " health points." << '\n';
    }
};
 
class MonsterGenerator
{
public:
    // Генерируем случайное число между min и max (включительно)
    // Предполагается, что srand() уже был вызван
    static int getRandomNumber(int min, int max)
    {
        static const double fraction = 1.0 / (static_cast<double>(RAND_MAX) + 1.0); // используем static, так как это значение нужно вычислить только один раз
        // Равномерно распределяем вычисление значения из нашего диапазона
        return static_cast<int>(rand() * fraction * (max - min + 1) + min);
    }
 
    static Monster generateMonster()
    {
        Monster::MonsterType type = static_cast<Monster::MonsterType>(getRandomNumber(0, Monster::MAX_MONSTER_TYPES - 1));
        int health = getRandomNumber(1, 100);
 
        static std::string s_names[6]{ "John", "Brad", "Alex", "Thor", "Hulk", "Asnee" }; 
        return Monster(type, s_names[getRandomNumber(0, 5)], health);
    }
};
 
int main()
{
    srand(static_cast<unsigned int>(time(0))); // используем системные часы в качестве стартового значения
    rand(); // пользователям Visual Studio: делаем сброс первого случайного числа
 
    Monster m = MonsterGenerator::generateMonster();
    m.print();
 
    return 0;
}
Вопрос в следующем непонятно что происходит в этой строчке №72
C++
1
Monster::MonsterType type = static_cast<Monster::MonsterType>(........)
Просто объявляется переменная (перечисление enum) которая определена в классе? И потому что перечисление в public: то я могу создать переменную такого типа, которая описана в классе Monster. Но не принадлежит не одному объекту? Может кто-нибудь разжевать, пока нигде не могу найти в литературе ответа на данный вопрос. Хотелось бы понять эту фишку.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2020, 12:58
Ответы с готовыми решениями:

Доступ одного класса к данным другого
Здравствуйте. Интересует следующий вопрос: Есть два класса, &quot;Вектор&quot; и &quot;Матрица&quot;. Их реализации...

Доступ дружественного оператора к приватным данным класса
Здравствуйте. тока начал изучение С++; составляю прогу практически по учебнику - реализация класса...

Наследование классов. Доступ к данным базового класса
Здравствуйте! Застрял на задачке... Суть самого задания: Создать класс Car (машина), который...

Дружественная функция не может получить доступ к приватным данным класса
Доброго времени суток уважаемые форумчане), пытаюсь реализовать дружественную функцию которая берет...

3
16079 / 8681 / 2120
Регистрация: 30.01.2014
Сообщений: 14,960
20.04.2020, 13:53 2
Лучший ответ Сообщение было отмечено SergeySerd как решение

Решение

SergeySerd, тип MonsterType объявлен в области видимости (scope) класса Monster. Для доступа к нему применяется оператор разрешения области видимости ::.

Цитата Сообщение от SergeySerd Посмотреть сообщение
пока нигде не могу найти в литературе ответа на данный вопрос.
Рекомендую книгу Липпмана - "Язык программирования C++. Базовый курс".
Параграф 7.4 Class scope (Область видимости класса в русском издании).

Добавлено через 4 минуты
Цитата Сообщение от SergeySerd Посмотреть сообщение
Просто объявляется переменная (перечисление enum) которая определена в классе?
Перечисление - это тип. Тип принадлежит области видимости класса Monster.
Сама переменная (в строке 72) - это type. Это локальная переменная в функции Monster::generateMonster, она не принадлежит объекту типа Monster, да.
1
Модератор
Эксперт С++
12067 / 9752 / 5896
Регистрация: 18.12.2011
Сообщений: 26,178
20.04.2020, 13:59 3
Цитата Сообщение от SergeySerd Посмотреть сообщение
static int getRandomNumber(int min, int max)
возвращает int.
А нам надо получить тип из перечисления Monster::MonsterType
Поэтому и выполняем соответствующее приведение static_cast<Monster::MonsterType>
0
0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 14
20.04.2020, 14:03  [ТС] 4
с приведением типов как раз логика понятна. просто вот ввело в замешательство, что перечисление объявленное в классе можно использовать вне класса.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2020, 14:03
Помогаю со студенческими работами здесь

Как получить доступ к данным класса, которые являются элементом вектора?
ситуация такая, есть собственноручно написанный Vector есть класс &quot;Person&quot;, с данными (имя,...

Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным ...

Доступ к данным из другого класса
Добрый день! Пишу чат клиент сервер. Нужен доступ к Label из другого класса. В классе...

Дать доступ к данным класса
Добрый день. class Game { List&lt;string&gt; words; //достаточно большой List&lt;Player&gt;...

Доступ к данным класса из других классов
Здравствуйте, я уже день мучаюсь над вопросом. У меня есть class MonitorFollderClass { ...

ООП. Доступ к данным из вложенного класса
public class mFiles { public string NameFile; //Имя файла public cNew News...


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

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

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