Tricky面试主题为C ++

给定下面的代码,您将如何创build/实现SR.h,以便在解决scheme中没有任何星号的情况下生成正确的输出结果?

我被这个问题弄得一团糟。 我想知道一些人们用于这个问题的不同方法。

#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 = %d\n", sum); } //The output is "sum = 161700". 

SR作为一个捕获variables恢复器。 当它超出范围时,它恢复以前捕获的一些价值。

构造函数将做两件事:捕获一个引用,并捕获该引用的值。 析构函数会将原始值恢复到该引用。

 class SR { public: SR(int& var) : capture(var), value(var) {} ~SR() { capture = value; } private: int& capture; int value; }; 

编辑:只是猜测,但我认为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); } 

换句话说,我认为范围恢复macros的概念真的很酷,但我不喜欢这个问题的措辞:)

解决第一个问题

 class SR { public: int initial; int* var; SR(int &a) : var(&a),initial(a){} ~SR() { *var = initial; } }; 

#2的解决scheme是:

 #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 

我知道这个解决scheme有点难看,它运行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; } };