62 Stimmen

Kniffliges Interviewthema für C++

Wie würden Sie den folgenden Code erstellen/implementieren, damit SR.h die richtige Ausgabe OHNE Sternchen in Ihrer Lösung erzeugt?

Diese Frage hat mich genervt. Ich würde gerne einige der verschiedenen Ansätze kennen, die Menschen für dieses Problem verwenden.

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

Ausgabe:

j = 10, a = {15, 10}
j = 5, a = {10, 15}

Die zweite:

#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".

11 Stimmen

Warum sollte das keine echte Frage sein? Übersehe ich etwas?

4 Stimmen

@sbi Interviewfragen, insbesondere künstliche, sind in der Regel nicht "echt". Nicht, dass ich diese Frage selbst heruntergestimmt oder knapp bewertet hätte.

0 Stimmen

Ich bin auch unsicher, was die negative Abstimmung angeht. Vielleicht müssen die Leute heutzutage schnell sein.

83voto

Bill Punkte 13799

SR fungiert als Erfassungsvariablen-Restorer. Wenn er den Anwendungsbereich verlässt, stellt er einen Wert wieder her, den er zuvor erfasst hat.

Der Konstruktor tut zwei Dinge: eine Referenz erfassen und den Wert dieser Referenz erfassen. Der Destruktor stellt den ursprünglichen Wert dieser Referenz wieder her.

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

private:
  int& capture;
  int value;
};

Edit: Nur eine Vermutung, aber ich nehme an, SR soll für ScopeRestorer stehen?

10 Stimmen

Mein Gedanke war SR = SaveRestore.

16voto

Kugel Punkte 18318

Ich habe keine Zeit, Code zu schreiben, aber Sie müssen Referenzen &int im Konstruktor verwenden. Und Sie müssten die ursprünglichen Werte der Referenzen im Destruktor wiederherstellen. Wenn SR den Anwendungsbereich verlässt, muss es die ursprünglichen Werte wiederherstellen, die während der Konstruktion übergeben wurden.

4voto

Seva Alekseyev Punkte 57252

Für den ersten:

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

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

Sollte es sich bei dem zweiten Ausschnitt um dieselbe SR oder um eine andere SR handeln?

0 Stimmen

Diese Lösung funktioniert für beides, also nehme ich an, dass sie für beides gedacht ist main Funktionen.

0 Stimmen

Hey!, was ich gelernt habe, ist Referenz sollte initalise sein, während deklarieren, also wie ist dies anders, funktioniert Konstruktor auf eine andere Weise?

4voto

Jack V. Punkte 1371
#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);
}

Oder, mit anderen Worten, ich denke, das Konzept des Scope Restorer Makros ist wirklich cool, aber ich mag es nicht, wie die Frage formuliert wurde :)

0 Stimmen

Haha, lustig! Das könnte tatsächlich eine klugscheißerische Antwort auf dieses Problem sein.

0 Stimmen

Ich bin fast versucht, ein Kopfgeld auszusetzen und es Ihnen zu geben.

2voto

luck Punkte 165

Lösung der ersten Frage

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

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

0 Stimmen

Ich weiß nicht, wer den Code heruntergestuft hat, aber ich habe das Gleichgewicht wiederhergestellt, da es für mich in diesem Fall einfacher ist, den Code zu lesen. Man weiß, was man speichert (eine Adresse zu einem Zeiger). Referenzwerte sind cool, aber das macht diese Antwort nicht falsch.

0 Stimmen

Danke @Volodya ja ich stimme Benutzer sollte Referenzen verwenden, wo sie anstelle von Zeigern verwendet werden können. Ich habe Zeiger einfach so verwendet, ohne besondere Gründe, mein Fokus war es, das Problem zu lösen :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X