Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача по программированию C++

wQ . Ученик (106), на голосовании 6 месяцев назад
В этой задаче вам предстоит реализовать паттерн прокси.
class IVault {
public:
virtual bool unlock(int password) = 0;
};
class Vault : public IVault {
int password;
public:
Vault(int password): password(password) {};
bool unlock(int pass) override {
return password == pass;
}
};
Перед вами абстрактный класс IVault, а также его наследник Vault.
Вам нужно написать класс прокси:
class Proxy : public IVault {
public:
Proxy(IVault* realObject, int attempts);
bool unlock(int pass) override;
};
В конструкторе передается указатель на объект Vault, а также переменная attempts.
Прокси должен перенаправлять вызовы unlock к реальному объекту, считать количество неудачных
вызовов, а возвращать тот результат, который вернул лежащий под прокси объект Vault. Однако
помимо этого он считает кол-во неудачных попыток(которые привели к false). Если кол-во
неудачных попыток превысило attempts раз, то прокси должен бросить исключение типа
ExceptionAttempts
class ExceptionAttempts : public std::exception {
};
Если у прокси был вызван unlock, который привел к true, или же прокси бросил исключение, это
этим объектом-прокси более не пользуются.
В систему отправляйте код классов ExceptionAttempts и Proxy, а также любой другой код,
который поможет решить задачу
Голосование за лучший ответ
resurce Гуру (4210) 7 месяцев назад
#include <exception>

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;
bool isLocked;

public:
Proxy(IVault* realObject, int attempts) : realObject(realObject), attempts(attempts), failedAttempts(0), isLocked(false) {}

bool unlock(int pass) override {
if (isLocked) {
throw ExceptionAttempts();
}

bool result = realObject->unlock(pass);
if (!result) {
failedAttempts++;
if (failedAttempts >= attempts) {
isLocked = true;
throw ExceptionAttempts();
}
} else {
isLocked = true;
}

return result;
}
};
wQ .Ученик (106) 7 месяцев назад
можно ли сократить данный код до размера менее 1 Мб?
resurce Гуру (4210) Удали переменные
Похожие вопросы