/
AirLexa
/
07
Обзор
Документация
Войти
/
AirLexa
/
07
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_03/Task_2/Task_2.cpp
114 строк
3 KB
AirLexa
урок 3
25 июн 2026, 13:54
Верифицирован
25 июн 2026, 13:54
dd3ebc1
Код
Авторство
О чём код?
#include <iostream> #include <fstream> #include <vector> // Базовый интерфейс наблюдателя class Observer { public: virtual ~Observer() = default; virtual void onWarning(const std::string& message) {} virtual void onError(const std::string& message) {} virtual void onFatalError(const std::string& message) {} }; // Наблюдаемый класс class Observable { public: // Добавить наблюдателя (не владеющий указатель) void addObserver(Observer* observer) { if (observer) m_observers.push_back(observer); } // Удалить наблюдателя (например, перед его уничтожением) void removeObserver(Observer* observer) { m_observers.erase(std::remove(m_observers.begin(), m_observers.end(), observer), m_observers.end()); } void warning(const std::string& message) const { for (Observer* obs : m_observers) obs->onWarning(message); } void error(const std::string& message) const { for (Observer* obs : m_observers) obs->onError(message); } void fatalError(const std::string& message) const { for (Observer* obs : m_observers) obs->onFatalError(message); } private: std::vector<Observer*> m_observers; // не владеющие указатели }; // Наблюдатель за предупреждениями - печатает в консоль class WarningObserver : public Observer { public: void onWarning(const std::string& message) override { std::cout << "[WARNING] " << message << std::endl; } }; // Наблюдатель за ошибками - записывает в файл class ErrorObserver : public Observer { public: explicit ErrorObserver(const std::string& filePath) : m_filePath(filePath) { } void onError(const std::string& message) override { std::ofstream file(m_filePath, std::ios::app); if (!file.is_open()) throw std::runtime_error("ErrorObserver: cannot open file " + m_filePath); file << "[ERROR] " << message << "\n"; } private: std::string m_filePath; }; // Наблюдатель за фатальными ошибками - консоль + файл class FatalErrorObserver : public Observer { public: explicit FatalErrorObserver(const std::string& filePath) : m_filePath(filePath) { } void onFatalError(const std::string& message) override { std::cout << "[FATAL] " << message << std::endl; std::ofstream file(m_filePath, std::ios::app); if (!file.is_open()) throw std::runtime_error("FatalErrorObserver: cannot open file " + m_filePath); file << "[FATAL] " << message << "\n"; } private: std::string m_filePath; }; int main() { Observable subject; WarningObserver warnObs; ErrorObserver errObs("task2_errors.txt"); FatalErrorObserver fatalObs("task2_fatal.txt"); subject.addObserver(&warnObs); subject.addObserver(&errObs); subject.addObserver(&fatalObs); subject.warning("Low disk space"); subject.error("Connection timeout"); subject.fatalError("Out of memory - system unstable"); subject.removeObserver(&warnObs); subject.warning("This warning has no console observer anymore"); std::cout << std::endl; return 0; }