Лабораторная работа № Ознакомление с фундаментальными типами данных План: Целые типы данных


Download 0.88 Mb.
bet25/64
Sana13.09.2023
Hajmi0.88 Mb.
#1677324
TuriЛабораторная работа
1   ...   21   22   23   24   25   26   27   28   ...   64
Bog'liq
Лаборатория № 1 - 6

Польза от перечислений
Перечисляемые типы невероятно полезны для документации кода и улучшения читабельности.
Например, функции часто возвращают целые числа обратно в caller в качестве кодов ошибок, если что-то пошло не так. Как правило, небольшие отрицательные числа используются для представления возможных кодов ошибок.
Например:

int readFileContents()
{
if (!openFile())
return -1;
if (!parseFile())
return -2;
if (!readFile())
return -3;
return 0; // если всё прошло успешно
}

Однако магические числа, как в примере выше, не очень эффективное решение. Альтернатива — использовать перечисления:

enum ParseResult
{
SUCCESS = 0,
ERROR_OPENING_FILE = -1,
ERROR_PARSING_FILE = -2,
ERROR_READING_FILE = -3
};
ParseResult readFileContents()
{
if (!openFile())
return ERROR_OPENING_FILE;
if (!parseFile())
return ERROR_PARSING_FILE;
if (!readfile())
return ERROR_READING_FILE;
return SUCCESS; // если всё прошло успешно
}

Это и читать легче, и понять проще. Кроме того, функция, которая вызывает другую функцию, может проверить возвращаемое значение на соответствующий перечислитель. Это лучше, нежели самому сравнивать возвращаемый результат с конкретными целочисленными значениями, чтобы понять какая именно ошибка произошла, не так ли?
Например:

if (readFileContents() == SUCCESS)
{
// Делаем что-нибудь
}
else
{
// Выводим сообщение об ошибке
}

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

#include
#include
enum ItemType
{
ITEMTYPE_GUN,
ITEMTYPE_ARBALET,
ITEMTYPE_SWORD
};
std::string getItemName(ItemType itemType)
{
if (itemType == ITEMTYPE_GUN)
return std::string("Gun");
if (itemType == ITEMTYPE_ARBALET)
return std::string("Arbalet");
if (itemType == ITEMTYPE_SWORD)
return std::string("Sword");
}
int main()
{
// ItemType - это перечисляемый тип, который мы объявили выше
// itemType (с маленькой i) - это имя переменной, которую мы определили (типа ItemType)
// ITEMTYPE_GUN - это значение перечислителя, которое мы присвоили переменной itemType
ItemType itemType(ITEMTYPE_GUN);
std::cout << "You are carrying a " << getItemName(itemType) << "\n";
return 0;
}

Или, если вы пишете функцию для сортировки группы значений:

enum SortType
{
SORTTYPE_FORWARD,
SORTTYPE_BACKWARDS
};
void sortData(SortType type)
{
if (type == SORTTYPE_FORWARD)
// Сортировка данных в одном порядке
else if (type == SORTTYPE_BACKWARDS)
// Сортировка данных в обратном порядке
}

Многие языки программирования используют перечисления для определения логических значений. По сути, логический тип данных — это простое перечисление всего лишь с двумя перечислителями: true и false! Однако в C++ значения true и false определены как ключевые слова вместо перечислителей.



Download 0.88 Mb.

Do'stlaringiz bilan baham:
1   ...   21   22   23   24   25   26   27   28   ...   64




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling