В этом уроке мы научимся как определять псевдонимы типов в С++ и узнаем для чего это может быть полезным.
Представьте что мы пишем программу, которая рассчитывает расстояние пройденное автомобилем за какое-то время и мы бы могли написать ее так:
int main() {
int speed_in_kilometers { 60 };
int travel_time { 2 };
int distance { speed_in_kilometers * travel_time };
}
Но возможность определения псевдонимов может сделать наш код более выразительным, синтаксис определения псевдонимов таков typedef <тип> <псевдоним>
:
int main() {
typedef int kilometers_per_hour_t; // определяем kilometers_per_hour_t как псевдоним типа int
typedef int hour_t;
kilometers_per_hour_t speed { 60 };
hour_t travel_time { 2 };
}
Названия типов стали длиннее, но более понятыми. Мы видим, что скорость измеряется в километрах в час, а время в часах. Обратите внимание, что хорошей практикой является у псевдонима определять суффикс _t
. Это помогает указать, что идентификатор представляет собой тип, а не переменную или функцию, а также помогает предотвратить конфликты имен с другими типами идентификаторов.
Когда еще нам могут понадобиться псевдонимы? Например, для определения псевдонимов сложных типов. Далее в курсе мы будем иметь дело с такими типами данных, как вектор и пара. Их определение довольно громоздко:
#include <vector> // для std::vector
#include <utility> // для std::pair
int main() {
std::vector<std::pair<int, double> > pair_list;
}
Ввод std::vector<std::pair<int, double> >
везде, где вам нужно использовать этот тип, может оказаться громоздким. Гораздо проще использовать псевдоним типа:
typedef std::vector<std::pair<int, double> > pair_list_t;
int main() {
pair_list_t pair_list;
}
Так же есть альтернативный новый синтаксис определения псевдонимов с помощью ключевого слова using
который пришел в С++ с 11 стандартом:
using kilometers_per_hour_t = int;
В соответствии со стандартами кодирования предпочтительнее определять псевдоним через using
чем через typedef
. Так же typedef
имеет ограничение, он не работает с шаблонами.
Так же следует учитывать, что typedef
и using
не определяет новый тип. Скорее, он просто создает новый идентификатор (псевдоним) для существующего типа.
В этом задании мы вспомним школьный курс физики. Напишите программу, которая рассчитывает максимальную мощность, на которую рассчитана бытовая розетка и выводит ее в консоль. Мощность рассчитывается по формуле: сила тока умноженная на напряжение. Сила тока измеряется в Ампер и равна 16, напряжение в Вольт, мощность в Ватт. Для определения величин используйте псевдонимы.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1#include "test_helper.h"
2
3TEST_CASE("testing solution") {
4 std::string expected = "3520\n";
5 std::string actual = get_output(sizeof(expected));
6
7 CHECK(actual == expected);
8}
9
Решение учителя откроется через: