Пишем калькулятор на C++ с SFML

Пишем калькулятор на C++ с SFMLПривет-привет, коллеги и те, кто любит покритиковать с доброй улыбкой! Сегодня я решил на пару часов отвлечься от своей эпопеи с кодом и написать про то, как сотворил калькулятор с графическим интерфейсом на C++20 и SFML. Не ждите тут мегапроекта уровня NASA — это скорее как приготовить бутерброд с колбасой: просто, быстро и вкусно. Но зато с изюминкой!

Да-да, ведь программирование — это не только баги и бесконечные дебаги, но иногда и удовольствие от того, что твой код сразу видно на экране. Вспомним старые-добрые времена: кто помнит свои первые попытки сделать калькулятор? У меня это было в эпоху динозавров — ещё на Pascal для курсовых. Тогда казалось, что я создаю машину времени, а не просто программу для сложения двух чисел.

Потом был этап «самодельных парсеров» на C — это как пытаться объяснить бабушке, что такое интернет через телефонную трубку. Сейчас можно взять Qt или даже Unreal Engine (шутка!), но я выбрал SFML версии 2.6.1 — последнюю стабильную по состоянию на март 2025 года.

Почему именно SFML? Ну, представьте себе: Qt — это как танк Т-34 для поездки в магазин за хлебом; мощно, но переборщили.

SDL — отличный парень, который умеет всё руками делать сам, но иногда просит тебя нарисовать даже собственные носки вручную. А SFML — это такой лёгкий велосипед с корзинкой: быстро настроился и поехал! Он дружит со всеми современными компиляторами вроде GCC 12 и MSVC 2022 без капризов и скандалов.

Для меня же главное — чтобы не тратить время на борьбу с зависимостями; знаете эту игру «поймай ошибку сборки», которая длится дольше всей разработки? Вот SFML её почти не предлагает.

SFML отлично подходит для быстрых экспериментов: хочешь прототип интерфейса — пожалуйста; хочешь визуализировать данные или сделать мелкую игрушку — легко! Например, пару лет назад я делал простой шутер под названием «Кощей» (да-да, тот самый бессмертный), где надо было рендерить тысячи клеток в реальном времени — никакие лаги меня не пугали.

Для больших проектов взял бы Qt или Unity (вдруг захочется трёхмерных приключений), а тут задача была проста: сделать рабочий калькулятор за пару часов без лишних заморочек.

Проект состоит из трёх классов плюс точка входа в программу. Я старался писать современно: никаких сырых указателей (прощай, delete!), только умные указатели std::unique_ptr и контейнеры std::vector вместо массивов С-стиля. Это как перейти от деревянной лопатки к электродрели в строительстве — удобнее и надёжнее.

Класс Button у меня получился простеньким: прямоугольник с текстом внутри и реакцией на клики.

Представьте кнопку как маленького боксера в ринге интерфейса — она должна вовремя ударить вас результатом вычислений или хотя бы показать эмоции при наведении мыши (ну почти). Благодаря std::unique_ptr память управляется сама собой – никаких утечек!

Как говорил один мой знакомый программист: «Утечки памяти – это как забыть выключить плиту дома – последствия могут быть печальными». Так что лучше довериться умным указателям.

Главный класс Calculator собирает все кнопки вместе и отвечает за логику работы приложения – он словно дирижёр оркестра из кнопок и цифр. А ExpressionEvaluator – наш герой-аналитик – парсит математические выражения рекурсивно!

Без него калькулятор был бы просто набором красивых кнопочек без смысла – как пельмени без начинки.