Библиотека C/C++ разработчика
7.21K subscribers
688 photos
719 videos
8 files
985 links
Полезные материалы по всему, что может быть полезно плюсовику/сишнику. По всем вопросам @evgenycarter
加入频道
Функция all_of

Эта функция работает со всем диапазоном элементов массива и может сэкономить время на запуск цикла для проверки каждого элемента по одному. Он проверяет заданное свойство для каждого элемента и возвращает true, когда каждый элемент в диапазоне удовлетворяет указанному свойству, иначе возвращает false.

В приведенном выше коде отрицательный элемент -6 отрицает условие и возвращает ложь.

#cpp #programming

👉 @cpp_lib
👍5
В этой статье рассказывается, как настроить проводную последовательную связь между двумя платами Arduino.

https://dev.to/yongchanghe/set-up-a-wired-serial-communication-between-arduino-boards-h9e

#cpp #programming #arduino

👉 @cpp_lib
👍1🔥1
Функция none_of()

Эта функция возвращает true, если ни один из элементов не удовлетворяет данному условию, иначе возвращает false.

Поскольку все элементы положительны, функция возвращает true.

#cpp #programming

👉 @cpp_lib
👍2
Как в С++ обрабатывать ошибки в конструкторах без исключений?

Преимущества использования исключений сомнительны, но мои претензии к ним не в этом. Исключения — экстраординарный инструмент, которые делает код более непонятным и запутанным. А прямую локальную обработку — слишком пространной. Исключения стали для меня худшим средством обработки ошибок. Печально, что создание объектов в С++ основано на их применении. Далее

#cpp #programming

👉 @cpp_lib
👍4
Функция unique

Unique используется для удаления дубликатов любого элемента, присутствующего последовательно в диапазоне [first, last). Он выполняет эту задачу для всех подгрупп, присутствующих в диапазоне, имеющих один и тот же элемент, присутствующий последовательно.

#cpp #programming

👉 @cpp_lib
🔥3👍1
Media is too big
VIEW IN TELEGRAM
Пошаговое описание того, как я создал библиотеку C++20 для реализации удаленных вызовов функций с очень небольшим количеством кода.

https://github.com/Dugy/bomba

#cpp #programming

👉 @cpp_lib
👍1
Алгоритм shuffle

Переупорядочивает элементы в заданном диапазоне [first, last) таким образом, чтобы каждая возможная перестановка этих элементов имела равную вероятность появления.

#cpp #programming

👉 @cpp_lib
👍1
Media is too big
VIEW IN TELEGRAM
Знакомство с C++: Клаус Иглбергер - Паттерны проектирования - Факты и заблуждения.

#cpp #programming

👉 @cpp_lib
👍3
Зачем нужен виртуальный деструктор?

Ответ: Чтобы избежать возможной утечки ресурсов или другого неконтролируемого поведения объекта, в логику работы которого включен вызов деструктора.

Пример:

class Base
{
public:
virtual ~Base()
{
std::cout << "Hello from ~Base()" << std::endl;
}
};

class Derived : public Base
{
public:
virtual ~Derived()
{
// Здесь могла бы быть очистка ресурсов
std::cout << "Hello from ~Derived()" << std::endl;
}
};

Base *obj = new Derived();
delete obj;

Output:
Hello from ~Derived()
Hello from ~Base()


Без ключевого слова virtual у родительского класса Base деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только ~Base():

Output:
Hello from ~Base()


#cpp #programming

👉 @cpp_lib
👍8
Что стоит помнить при использовании исключений в конструкторе объекта?

Ответ: Если исключение не обработано, то c логической точки зрения разрушается объект, который еще не создан, а с технической, так как он еще не создан, то и деструктор этого объекта не будет вызван.

Пример:

class Base
{
private:
HANDLE m_hFile;

public:
Base()
{
std::cout << "Hello from Base()" << std::endl;
m_hFile = ::CreateFileA(...);
// Вызываем код, который в ходе своего выполнения бросает исключение
SomeLib.SomeFunc(...);
}

virtual ~Base()
{
std::cout << "Hello from ~Base()" << std::endl;
// Здесь мы планировали закрыть хэндл
::CloseHandle(m_hFile);
}
};

try
{
Base b;
}
catch(const std::exception &e)
{
std::cout << "Exception message: " << e.what() << std::endl;
}

Output:
Hello from Base()
Exception message: Something failed

Я немного модифицировал предыдущий пример, чтобы проблема была наглядней. Здесь объект m_hFile (если был открыт) утечет т.к. до CloseHandle() выполнение не дойдет. Т.е. имеем такие же проблемы как в первом примере: возможная утечка ресурсов или другие проблемы из-за нарушения логики работы класса.

Здесь могут спросить: «Как бы вы поступили при подобной ситуации». Правильный ответ: «Воспользовался бы умными указателями». Простой пример умного указателя:
class Base
{
private:
class CHandle
{
public:
~CHandle()
{
::CloseHandle(m_handle);
}
private:
HANDLE m_handle;
public:
// Для полноценного smart pointer'а перегрузки одной операции
// не достаточно, но для нашего примера и понимания вполне хватит
void operator = (const HANDLE &handle)
{
m_handle = handle;
}
};

CHandle m_hFile;

public:
Base()
{
std::cout << "Hello from Base()" << std::endl;
m_hFile = ::CreateFileA(...);
// Вызываем код, который в ходе своего выполнения бросает исключение
SomeLib.SomeFunc(...);
}

virtual ~Base()
{
std::cout << "Hello from ~Base()" << std::endl;
}
...

Теперь и без вызова деструктора Base хэндл будет закрыт, т.к. при уничтожении класса Base будет уничтожен объект m_hFile класса CHandle, в деструкторе которого и будет закрыт хэндл.

Изобретать велосипед, конечно, не надо, все уже написано до нас, это пример который можно написать на бумажке при соответствующем вопросе. А так есть boost, Loki, ATL и т.п., где это уже реализовано.

#cpp #programming

👉 @cpp_lib
👍3
LearnCpp.com - это бесплатный сайт, посвященный обучению программированию на C++. Независимо от того, есть ли у вас опыт программирования или нет, учебники на этом сайте проведут вас через все этапы написания, компиляции и отладки программ на C++ с большим количеством примеров.

#cpp #programming

👉 @cpp_lib
👍6