2010-02-25 22 views
5

Ich habe eine Klasse, die etwa wie folgt aussieht:C++ unter Verwendung von ‚this‘ als Parameter

class MeshClass 
{ 
public: 
    Anchor getAnchorPoint(x, y) 
    { 
     return Anchor(this, x, y); 
    } 
private: 
    points[x*y]; 
} 

Ich möchte eine andere Klasse machen, die einen „Anchor“ Punkt darstellt, die den Zugriff auf das Netz erhalten und ändern der Punkt, wie folgt aus:

class Anchor 
{ 
public: 
    Anchor(&MeshClass, x, y) 
    moveAnchor(x, y); 
} 

das Problem ist, wenn ich versuche, die Anchor im MeshClass::getAnchorPoint Methode, so etwas wie return Anchor(this, x, y) zu machen, sondern weil this const ist kann ich nicht. Als Workaround, bis ich das herausgefunden habe, habe ich einen Anker, der einen Verweis auf den Punkt akzeptiert, und moveAnchor bewegt den Punkt direkt.

Edit: Das Problem war wahrscheinlich etwas Dummes, das ich mit dem Versuch, eine Referenz verwenden wollte. Ich wechselte zu einem Zeiger wie ich normalerweise würde und ich kann this ohne Beschwerden vom Compiler weitergeben. Ich bin mir fast sicher, dass ich einen Fehler bekommen habe, der darauf hinweist, dass dies const ist, aber ich kann es nicht neu erstellen, also muss ich einfach verrückt sein.

+0

Hallo, für mich Ihr ist wohl nicht ... kompilieren es tut? –

+1

Es ist wahrscheinlich (noch) nicht :) Bedenkt, dass (zumindest im einfachen alten C), wenn der Typ nicht angegeben ist, es standardmäßig int, sondern eine Warnung auslöst. –

+2

Bitte schreiben Sie den tatsächlichen Code, den Sie verwenden möchten, und den Fehler, den er generiert. (Nicht, wie Sie versucht haben, diesen Fehler zu umgehen.) Es ist momentan etwas schwer zu erraten, was Sie zu tun versuchen. –

Antwort

8

In C++ ist dies ein Zeiger, keine Referenz. Man könnte so etwas tun:

class Anchor; //forward declaration 

class MeshClass 
{ 
public: 
    Anchor getAnchorPoint(int x, int y) 
    { 
     return Anchor(*this, x, y); 
    } 
private: 
    int points[WIDTH*HEIGHT]; 
} 

class Anchor 
{ 
public: 
    Anchor(MeshClass &mc, int x, int y); 
} 
+0

Das war wahrscheinlich mein Problem. Ich entschied mich dafür, dass Anchor einen Zeiger anstelle eines Verweises akzeptiert. In diesem Fall scheint 'this' nun als Parameter zu funktionieren. – Winder

1

Warum denken Sie, this ist const? this ist ein Zeiger, keine Referenz. Sollte es nicht return Anchor(*this, x, y); sein?

+0

Technisch ist das eigentlich _ist_, das ist es nicht. – Joel

+0

Technisch ist 'this' nicht const-qualifiziert. Es ist nicht modifizierbar, weil es ein rvalue ist, nicht weil es const ist. Dies bedeutet, dass 'this 'den Typ' Class * 'hat, aber * not *' Class * const'. –

0

Könnten Sie Anchor ändern, um eine const MeshClass& als Parameter zu übernehmen, oder werfen diese als (MeshClass), wenn der Anker zu schaffen? Ich bin mir nicht sicher, ob man const_cast<MeshClass>(this) verwenden kann, um die Konstanz von this zu entfernen.

2

Die Konstantheit von dieser kein Problem ist. Der Zeiger selbst ist const, nicht der Wert, auf den er zeigt.

Ihr Problem ist hier:

class MeshClass 
{ 
public: 
    Anchor getAnchorPoint(x, y) 
    { 
     return Anchor(*this, x, y); 
    } 
private: 
    points[x*y]; 
} 
Verwandte Themen