c++ BreakTheCode
В этой задаче вам предстоит сломать инкапсуляцию.
А именно, в систему загружен следующий код:
class SecretClass {
private:
std::string token;
protected:
void SetTokenTo(SecretClass& another) {
another.token = token;
}
public:
SecretClass(const std::string& token) : token(token) {};
std::string GetToken() const {
return token;
}
};
void externalFunction(SecretClass& secret);
int main() {
SecretClass secret("FUTURE");
externalFunction(secret);
assert(secret.GetToken() == "CODE");
}
assert работает следующим образом. Если выражение в скобках является true, то ничего не происходит. Если выражение в скобках является false, ваше решение падает с ошибкой RE.
Ваша задача реализовать функцию
void externalFunction(SecretClass& secret);
таким образом, чтобы выражение secret.GetToken() == "CODE" в конце main в скобках assert было true.
Вы можете помимо этой функции реализовать и другие вспомогательные функции/классы, если они помогут вам решить задание. Весь ваш код будет вставлен в систему между классом SecretClass и функцией main.
В систему отправляйте лишь код функции, необходимые библиотеки и вспомогательные функции/классы. Всё остальное будет подключено автоматически
Ответы
В задаче нужно изменить значение приватного поля token объекта класса SecretClass, переданного в функцию externalFunction, на значение "CODE".
Для этого можно воспользоваться защищенным методом SetTokenTo, который позволяет изменять значение поля token другого объекта класса SecretClass.
Реализация функции externalFunction будет выглядеть следующим образом:
void externalFunction(SecretClass& secret) {
SecretClass another("CODE");
secret.SetTokenTo(another);
}
Создается временный объект another с инициализацией поля token значением "CODE". Затем вызывается метод SetTokenTo объекта secret, который изменяет значение поля token объекта another на значение поля token объекта secret. Таким образом, значение приватного поля token объекта secret изменится на "CODE".