C++ Academy
16.1K subscribers
374 photos
112 videos
1 file
382 links
По всем вопросам- @haarrp
Download Telegram
🖥 Интеграция HTML/CSS UI в разработку C++ приложений

▶️Итак, если вам требуется быстро интегрировать веб-интерфейс в приложение, написанное на C++, используйте Chromium Embedded Framework (CEF). Подключив экземпляр CEF к вашему проекту, загрузите HTML-документ и запустите цикл обработки событий CEF. Эта гибридная схема разработки позволит вам реализовать интерфейс на HTML/CSS, оставив при этом бекенд на C++. Выглядеть это может как-то так:
#include "include/cef_app.h"

int main(int argc, char* argv[]) {
CefMainArgs main_args(argc, argv);
CefSettings settings;

// выполняем инициализацию
CefInitialize(main_args, settings, nullptr, nullptr);

// создаем окно с UI
CefWindowInfo window_info;
CefBrowserHost::CreateBrowser(window_info, new SimpleHandler(), "file:///your_ui.html", CefBrowserSettings(), nullptr);

// цикл обработки сообщений
CefRunMessageLoop();

// Cef для окончания работы
CefShutdown();
}

Замените "file:///your_ui.html" на путь к вашему HTML-файлу. Вуаля! Ваш интерфейс на HTML/CSS уже встроен в приложение на C++.


▶️CEF зарекомендовал себя как надёжное решение для интеграции Chromium в приложения на C++, однако есть и другие варианты, которые стоит рассмотреть:

Electron: Объединяет Chromium и Node.js, позволяя использовать JavaScript для построения настольных приложений.

Ultralight: Идеально подходит для приложений на OpenGL или DirectX, где важна эффективность рендеринга HTML.

Qt WebEngine: Дает доступ к возможностям Qt с поддержкой интеграции веб-контента.

Sciter: Имеет компактный движок для работы с HTML/CSS, поддерживающий такие возможности, как SVG и WebSocket.

Awesomium, движки на базе WebKit или Gecko: Предлагают функциональность, схожую с CEF, однако с некими уникальными отличиями.


▶️При выборе фреймворка обратите внимание на его уровень зрелости, поддержку со стороны сообщества и доступность документации.

📎 Читать подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Ежегодная программа Google Summer of Code 2024

Organic Maps призывает всех желающих принять участие в ежегодной программе Google Summer of Code 2024 (GSoC), в рамках которой контрибьюторы со всего мира участвуют в разработке программного обеспечения с открытым исходным кодом под руководством опытных наставников из различных организаций.

Участвуйте в GSoC, пробуйте свои силы)

🖥 Organic Maps, Github 8K⭐️
(большая часть проекта на C++, 76.1%)

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Неплохой вебинар про атомарные типы данных и Memory Ordering в C++

Обсуждаются типы данных в C++, для которых не нужна дополнительная синхронизация при конкуретном доступе.
Параллельно спикер рассказывает, как С++ помогает тонко оптимизировать lock-free разработку с помощью memory ordering.
Рекомендую, затрагивается много полезных для понимания вещей

📎 Кликабельный план вебинара
📎 YouTube

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 C++ Insights – Посмотрите на свой исходный код глазами компилятора

Цель C++ Insights - сделать видимыми вещи, которые обычно происходят за кулисами. Речь идет о волшебстве, которое компилятор совершает для нас, чтобы заставить все работать.

Github

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Релиз среды разработки Qt Creator 13

3 апреля 2024 года состоялся релиз открытой среды разработки Qt Creator 13. Это событие произошло после недавнего выпуска фреймворка Qt 6.7 и спустя пять месяцев после выхода Qt Creator 12.

Qt Creator (ранее известная под кодовым названием Greenhouse) — свободная IDE для разработки на С, C++, JavaScript и QML. Разработана Trolltech (Digia) для работы с фреймворком Qt. Включает в себя графический интерфейс отладчика и визуальные средства разработки интерфейса как с использованием QtWidgets, так и QML. Поддерживаемые компиляторы: GCC, Clang, MinGW, MSVC, Linux ICC, GCCE, RVCT, WINSCW.

В состав Qt Creator входит передовой инструмент Qt Designer, позволяющий создавать внешний вид окна приложения, добавляя и перетаскивая элементы по аналогии Windows Forms в Visual Studio. В качестве систем сборки используются qmake, cmake и autotools.

📎 Подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Отличный онлайн-учебник по C++

Держите годный онлайн-учебник по C++, здесь обсуждаются самые нужные темы, много кода с детальным объяснением, много практических заданий

Вот некоторые из обсуждаемых тем:
• Множественное и виртуальное наследование
• Идентификация типов во время выполнения
• Определение шаблона функции
• Абстрактные контейнерные типы
• Перегрузка операторов
• Область видимости и время жизни
• Инициализация, присваивание и уничтожение класса

📎 Учебник

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Возврат указателя на локальную переменную C++

▶️Есть два варианта функции. Почему не работает первый - понятно, но почему тогда срабатывает второй вариант?

Первый:
int* f() {
int b = 10;
return &b;
}


Второй:
int* f() {
int b = 10;
int* a = &b;
return a;
}



▶️Во-первых, оба варианта неверные, так как локальные переменные умирают вместе с фреймом стека функции, в которой они определены.

Почему 1 вариант не компилируется? Компилятор, очевидно, видит, что вы возвращаете указатель на локальную переменную, и выдаёт ошибку (или, скорее всего, предупреждение).

Почему же тогда 2 вариант компилируется? Дело в том, что компилятор не обязан ловить нас за руку каждый раз, когда мы совершаем ошибку. Он не будет рассматривать то, откуда пришли значения во всех переменных, которые мы возвращаем.
Если в 1 случае компилятор нам помог (потому что это было легко), то во 2 он просто решил этого не делать (потому что ему пришлось бы анализировать, откуда пришло значение переменной a).

Почему 2 вариант работает? А случайно. Значит в стеке случайно ничего не затёрло переменную, расположенную в ничьей памяти. Вот эту самую ничью память случайно никто не забрал. А мог забрать в любой момент. Лучше так не делать, поскольку в этом случае никаких гарантий нормальной работы программы нет.

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Подборка лучших обучающих каналов для программистов.

➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять

Машинное обучение

Machine Learning - запускаем лучшие ИИ модели, пишем код, погружаемся в нейросети
Ml Собеседование - подготовка к собесу по мл, алгоритмам, коду
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат

🏆 Golang
Golang - изучи один из самых перспективных языков на ит-рынке
Golang собеседование - разбор задач и вопросов с собесов
Golang вакансии -работа для Go разработчика
Golang книги библиотека книг
Golang задачи и тесты
Golang чат
Golang news - новости из мира go
Golang дайджест

💥 Linux /Этичный хакинг
Linux Academy - гайды, секреты и лучшие материалы по Linux
Kali linux - погрузись в мир этичного хакинга и кибербезопасности
linux_kal - kali чат
Информационная безопасность

🚀 Data Science

Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data

🛢Базы данных
Sql базы данных - научим работе с базами данных профессионально
Библиотека баз данных
SQL чат
Вакансии Sql аналитик данных

#️⃣C#

С# академия - лучший канал по c#
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа

🐍 Python

Python/django - самый крупный обучающий канал по Python
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги

Java

Java академия - java от Senior разработчика
Java вакансии
Java чат
Java вопросы с собеседований
Java книги

💻 C++

C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии

⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend

🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов

📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки

🇬🇧 Английский для программистов

🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence

🔥 DevOPs
Devops для программистов
Книги Devops

🌟 Docker/Kubernets
Docker
Kubernets

📓 Книги
Библиотеки Книг для программситов

💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend
🖥 string::npos в C++: разбираемся с примерами

Стандартная библиотека языка C++ предоставляет ряд удобных инструментов для работы со строками. Одной из важных констант при работе с объектами std::string является std::string::npos. Давайте освежим, что это за константа и как её можно использовать.

std::string::npos — это статическая константа класса std::string, представляющая максимально возможное значение для типа size_t. Эта константа часто используется для индикации отсутствия позиции символа или подстроки в строке.

Сама же константа объявлена как -1. Как же тогда она хранит максимально возможное значение size_t? Дело в том, что size_t не может хранить отрицательные числа. Поэтому значение -1 переходит как бы “по кругу” и становится самым большим числом, которое size_t может хранить. Поэтому мы можем использовать -1 вместо string::npos при работе со стандартными методами класса string в C++.

Как использовать npos с методом find? Метод find объекта std::string возвращает позицию первого вхождения подстроки или символа в строке. Если подстрока или символ не найдены, метод возвращает std::string::npos.
std::string str = "Привет, мир!";
size_t pos = str.find("мир");
if (pos != std::string::npos) {
std::cout << "Подстрока найдена на позиции: " << pos << std::endl;
} else {
std::cout << "Подстрока не найдена." << std::endl;
}
// Подстрока найдена на позиции: 14


Как использовать npos с методом erase? Метод erase объекта std::string позволяет удалять подстроку из строки. Если вам нужно удалить все символы начиная с определенной позиции до конца строки, вы можете использовать std::string::npos в качестве второго аргумента:
std::string str = "Привет, мир!";
str.erase(12, std::string::npos);
std::cout << str << std::endl; // Вывод: "Привет"
// Привет


📎 Читать подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Онлайн-конвертер фрагментов кода C++

Держите неплохой инструмент, позволяющий преобразовать плюсовый код в Java или Python.
Разумеется, всё работает за счёт AI
Тестите, пишите, как оно)

📎 Конвертер

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 В чем разница между operator new и expression new?

Вообще, это совершенно разные, хоть и взаимосвязанные, вещи.
New-expression - это встроенная конструкция языка, при помощи которой в языке С++ создаются объекты в динамической памяти. Например
int *p1 = new int();
SomeClass *p2 = new SomeClass[20];


А operator newoperator new[]) - это функции выделения "сырой" неинициализированной памяти, которые неявно вызываются изнутри new-expression. В упрощенной форме алгоритм работы new-expression состоит из двух этапов:

🟡1. Вызвать функцию выделения "сырой" памяти operator new/operator new[]

🟡2. Проинициализировать (если необходимо) полученную от operator new "сырую" память - например, путем вызова конструктора(-ов) создаваемого объекта(-ов).

Стандартная библиотека предоставляет некую "базовую" реализацию функций operator new. Эти функции, при необходимости, также являются замещаемыми/перегружаемыми пользователем, в том числе индивидуально для каждого пользовательского класса.

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Что делает код int main(){[](){}();}

▶️Забавный вопрос с собеседования: что делает данный код?
int main(){[](){}();}


▶️Правильный ответ: ничего не делает.
А означает он следующее:
int main()  // Функция main без аргументов.
{
[] // Объявление лямбда-функции без списка захвата...
() // ... с пустым списком аргументов ...
{} // ... и пустым телом, ...
(); // ... которая тут же вызывается.
}


@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM