9.x – Резюме к главе 9 и небольшой тест
Краткое резюме
Перечислимые типы позволяют нам определить наш собственный тип, в котором перечислены все возможные значения. Они отлично подходят для категоризации вещей.
Классы перечислений работают как перечисления, но обеспечивают бо́льшую безопасность типа и не так сильно загрязняют инкапсулирующее пространство имен.
И, наконец, структуры предлагают нам способ сгруппировать связанные переменные в единую структуру и получать к ним доступ с помощью оператора выбора члена (.
). Объектно-ориентированное программирование во многом основывается на них, поэтому, если вы изучили только что-то одно из этой главы, убедитесь, что это именно структуры.
Небольшой тест
Вопрос 1
При разработке игры мы решаем, что нам нужны монстры, ведь всем нравится сражаться с монстрами. Объявите структуру, представляющую вашего монстра. Монстр должен иметь один из следующих типов: огр, дракон, орк, гигантский паук или слизь. Используйте для этого класс перечисления.
У каждого отдельного монстра также должно быть имя (используйте std::string
), а также количество здоровья, которое показывает, сколько урона он может получить до своей смерти. Напишите функцию с именем printMonster()
, которая выводит на печать все члены структуры. Создайте экземпляр огра и слизи, инициализируйте их с помощью списка инициализаторов и передайте их в printMonster()
.
Ваша программа должна выдать следующий результат:
This Ogre is named Torg and has 145 health.
This Slime is named Blurp and has 23 health.
Ответ
#include <iostream> #include <string> // Определяем разные типы монстров как перечисление enum class MonsterType { ogre, dragon, orc, giant_spider, slime }; // Структура монстра представляет одного монстра struct Monster { MonsterType type {}; std::string name {}; int health {}; }; // Возвращаем название типа монстра в виде строки // Поскольку это можно было бы использовать где-нибудь еще, // лучше сделать эту функцию отдельной std::string getMonsterTypeString(MonsterType type) { switch (type) { case MonsterType::ogre: return "Ogre"; case MonsterType::dragon: return "Dragon"; case MonsterType::orc: return "Orc"; case MonsterType::giant_spider: return "Giant Spider"; case MonsterType::slime: return "Slime"; } return "Unknown"; } // Распечатываем информацию о монстре void printMonster(Monster monster) { std::cout << "This " << getMonsterTypeString(monster.type) << " is named " << monster.name << " and has " << monster.health << " health.\n"; } int main() { Monster ogre{ MonsterType::ogre, "Torg", 145 }; Monster slime{ MonsterType::slime, "Blurp", 23 }; printMonster(ogre); printMonster(slime); return 0; }