C++ Unklarheit this referenz

aroxx

Lieutenant
Registriert
März 2012
Beiträge
950
Hi,

ich verstehe nicht ganz, was in folgendem Code passiert:

Code:
class FifteenPuzzle
{
public:
    static const int MAX_NEIGHBORS = 4;

    FifteenPuzzle(const std::string& config="abcdefghijklmnoX")
    {
        for (int y = 0; y < 4; ++y) {
            for (int x = 0; x < 4; ++x) {
                tiles[y * 4 + x] = config[y * 4 + x];
                if (tiles[y * 4 + x] == 'X') {
                    cX = x;
                    cY = y;
                }
            }
        }
    }

    int neighbors(FifteenPuzzle *hood) const
    {
        int num = 0;
        if (cX > 0) {
            FifteenPuzzle& ref = hood[num];
            ref = *this;
            ++num;
            std::swap(ref.tiles[cY * 4 + cX],
                      ref.tiles[cY * 4 + cX - 1]);
            --ref.cX;
        }
(...)

genauer gesagt diese beiden Zeilen:
Code:
            FifteenPuzzle& ref = hood[num];
            ref = *this;

bin mir nicht sicher, ob die Frage mit diesem Code Schnipsel zu beantworten ist.
Mein Verständnis von "this" kommt von Java und ich denke, das wird in cpp ähnlich verwendet. Ich verstehe nicht nicht, warum man ref sofort nach der Instanziierung überschreiben möchte...

Viele Grüße
arox
 
Zuletzt bearbeitet:
Der Code ist etwas unglücklich gewählt. Du überschreibst nicht die Referenz selbst, sondern das, was sie referenziert.
Vielleicht wird es klarer, wenn man das ganze mal in Pointer-Schreibweise schreibt (was ich in so einem Fall grundsätzlich auch machen würde):

Code:
FifteenPuzzle* const ref = hood + num; // Pointer, der sich selbst nicht ändert - 'const'
*ref = *this;                          // Kopiere Inhalt von (this) nach (ref)

Oder, nochmal anders ausgedrückt:
Code:
FifteenPuzzle& ref = hood[num];
ref.operator = (*this);
Das kann man tatsächlich schreiben, die meisten Operatoren sind nichts anderes als Funktionen mit schönerer Syntax.
Referenzen in C++ zeigen immer auf dasselbe Object - ist das unerwünscht, braucht man einen Pointer.


Noch was: this ist in der Funktion vom Typen const FifteenPuzzle*, weil die Methode einen const-Qualifier hat. Deswegen kann man am Objekt hinter this auch nichts verändern.
 
Zuletzt bearbeitet:
Zurück
Oben