Задача:
Создать класс ExceptionAttempts, который наследуется от std::exception.
Создать класс Proxy, который будет наследоваться от IVault и будет являться прокси для объекта Vault.
В классе Proxy реализовать метод unlock, который будет перенаправлять вызовы к реальному объекту Vault, считать количество неудачных попыток и выбрасывать исключение, если количество попыток превышает заданный лимит.
Решение:
Для начала, давайте создадим класс ExceptionAttempts и класс Proxy.
#include
#include
class ExceptionAttempts : public std::exception {
public:
const char* what() const noexcept override {
return "Too many attempts";
}
};
class Proxy : public IVault {
private:
IVault* realObject;
int attempts;
int failedAttempts;
public:
Proxy(IVault* realObject, int attempts)
: realObject(realObject), attempts(attempts), failedAttempts(0) {}
bool unlock(int pass) override {
if (failedAttempts >= attempts) {
throw ExceptionAttempts();
}
bool result = realObject->unlock(pass);
if (!result) {
failedAttempts++;
}
return result;
}
};
Объяснение кода:
Класс ExceptionAttempts:
Наследуется от std::exception.
Переопределяет метод what, чтобы возвращать сообщение об ошибке.
Класс Proxy:
Имеет приватные поля: указатель на реальный объект IVault* realObject, максимальное количество попыток int attempts и счетчик неудачных попыток int failedAttempts.
Конструктор принимает указатель на реальный объект и количество допустимых попыток.
Метод unlock проверяет, превысило ли количество неудачных попыток лимит. Если да, выбрасывает исключение.
Если количество попыток не превышено, вызывает метод unlock реального объекта и обновляет счетчик неудачных попыток в случае неудачи.