Сложная тема интервью для C++
учитывая приведенный ниже код, как бы вы создали / реализовали SR. h, чтобы он производил правильный вывод без каких-либо звездочек в вашем решении?
Я был обескуражен этим вопросом. Я хотел бы знать несколько разных подходов, которые люди используют для этой проблемы.
#include <cstdio>
#include "SR.h"
int main()
{
int j = 5;
int a[] = {10, 15};
{
SR x(j), y(a[0]), z(a[1]);
j = a[0];
a[0] = a[1];
a[1] = j;
printf("j = %d, a = {%d, %d}n", j, a[0], a[1]);
}
printf("j = %d, a = {%d, %d}n", j, a[0], a[1]);
}
выход:
j = 10, a = {15, 10}
j = 5, a = {10, 15}
второй:
#include <cstdio>
#include "SR.h"
int main()
{
int sum = 0;
for (int i = 1; i < 100; i++) {
SR ii(i);
while (i--)
sum += i;
}
printf("sum = %dn", sum);
}
//The output is "sum = 161700".
7 ответов:
SR действует как восстановитель захваченной переменной. Когда он выходит из области действия, он восстанавливает некоторое значение, которое он ранее захватил.
конструктор будет делать две вещи: захват ссылки и захват значения этой ссылки. Деструктор восстановит исходное значение для этой ссылки.
class SR { public: SR(int& var) : capture(var), value(var) {} ~SR() { capture = value; } private: int& capture; int value; };
Edit: просто предположение, но я предполагаю, что SR должен стоять за ScopeRestorer?
У меня нет времени писать код, но вам нужно использовать ссылки &int в конструкторе. И вам нужно будет восстановить исходные значения для ссылок в деструкторе. Когда SR выходит из области действия, ему необходимо восстановить исходные значения, которые были переданы во время строительства.
первый:
class SR { int &ref; int orig; public: SR(int& r) :ref(r), orig(r) { } ~SR() { ref = orig; } };
для второго фрагмента должен быть тот же SR или какой-то другой SR?
#define printf myprintf void myprintf(int, int, int, int) { printf("j = 10, a = {15, 10}\nj = 5, a = {10, 15}"); exit(0); } void myprintf(int, int) { printf("sum = 161700"); exit(0); }
или, другими словами, Я думаю, что концепция макроса реставратора области действительно крута, но мне не нравится, как был сформулирован вопрос:)
решение первого вопроса
class SR { public: int initial; int* var; SR(int &a) : var(&a),initial(a){} ~SR() { *var = initial; } };
решение № 2 составляет:
#define _SR_H_ int count = 0; class SR { private: int& ref; public: SR(int& val) : ref(val) { count++; } ~SR() { if (count == (161700 + 1)) { ref = 100; } else { ref = 1; } } }; #endif
Я знаю, что это решение немного уродливо, и он запускает
for
цикл 161700 раз, чтобы добавить числа. Это будет работать для любого числа, но я не уверен, почему был выбран 161700. Это тоже не очень хорошо факторизуется.
очень уродливый ответ на второй вопрос ==>
class SR { public: int* var; int initial; SR(int &a) : var(&a) { initial = *var; if (1 == *var) { *var = 569; } else if (2 == *var) { *var = 5; } else if ((99 == *var) || (98 == *var) || (97 == *var )) { *var = 0; } else { *var = 2; } } ~SR() { *var = initial; } };