с++ 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.
В систему отправляйте лишь код функции, необходимые библиотеки и вспомогательные функции/
классы. Всё остальное будет подключено автоматически
Ответы на вопрос
Основная идея решения заключается в том, чтобы использовать функцию SetTokenTo, которая доступна внутри наследников класса SecretClass, чтобы изменить закрытую переменную token. Для этого можно создать новый класс, наследующийся от SecretClass, и в нём реализовать функцию, которая изменит token.
Вот как это можно сделать:
class SubSecretClass : public SecretClass {
public:
SubSecretClass(const std::string& token) : SecretClass(token) {};
void changeToken(SecretClass& secret, const std::string& new_token) {
token = new_token; // Изменяем token в объекте SubSecretClass
SetTokenTo(secret); // Копируем изменённый token в переданный secret
}
};
void externalFunction(SecretClass& secret) {
SubSecretClass subSecret("DUMMY"); // Создаём экземпляр SubSecretClass
subSecret.changeToken(secret, "CODE"); // Изменяем token в объекте secret
}
Таким образом, externalFunction меняет значение token в переданном ей объекте SecretClass, используя его protected функцию через объект SubSecretClass.