Информатика, вопрос задал nicka221232 , 1 год назад

с++ 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.
В систему отправляйте лишь код функции, необходимые библиотеки и вспомогательные функции/
классы. Всё остальное будет подключено автоматически

Ответы на вопрос

Ответил flash77779
0

Основная идея решения заключается в том, чтобы использовать функцию 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.

Новые вопросы