C ++的棘手面试主题

时间:2010-03-11 20:22:30

标签: 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 = %d\n", sum);
}

//The output is "sum = 161700".

7 个答案:

答案 0 :(得分:80)

SR充当捕获变量恢复器。当它超出范围时,它会恢复之前捕获的一些值。

构造函数将执行两项操作:捕获引用,并捕获该引用的值。析构函数会将原始值恢复为该引用。

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

private:
  int& capture;
  int value;
};

编辑:只是一个猜测,但我认为SR应该代表ScopeRestorer?

答案 1 :(得分:16)

我没有时间编写代码但是,你需要在构造函数中使用references&amp; int。并且您需要将原始值恢复为析构函数中的引用。当SR超出范围时,它需要恢复在构造期间传入的原始值。

答案 2 :(得分:4)

第一个:

class SR
{
    int &ref;
    int orig;
public:
    SR(int& r)
    :ref(r), orig(r)
    {
    }

    ~SR()
    {
        ref = orig;
    } 
};

对于第二个片段,它应该是相同的SR还是其他SR?

答案 3 :(得分:3)

#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);
}

或者,换句话说,我认为范围恢复器宏的概念非常酷,但我不喜欢这个问题的措辞:)

答案 4 :(得分:2)

第一个问题的解决方案

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

~SR()
{
    *var = initial;
}
};

答案 5 :(得分:0)

#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。它也没有很好地分解。

答案 6 :(得分:-1)

非常非常难看的回答第二个问题==&gt;

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;
}
};