Wie den Zugriff auf eine Private Variable?
Diese Frage soll nicht klingen, als krass beleidigen wie es wohl jetzt ist.
Dies ist eine Hausaufgabe, und das Datenblatt ist knapp und schlecht entworfen, um das Mindeste zu sagen. Wir haben eine Funktion:
double refuel( int liter, GasStation *gs )
{
//TODO: Access private variable MaxFuel of gs and decrement.
}
Klingt einfach genug? Sollte es sein, aber die Klasse Tankstelle kommt keine Funktion, die auf die private variable MaxFuel. Also wie kann ich es trotzdem mit der Funktion tanken?
Ich bin nicht angesichts der Erstellung einer Funktion setFuel( int liter )
weil die Lehrer immer beschwert, eher energetisch, wenn ich eine änderung seiner Spezifikation. Also... ich glaube, ich habe zu tun, irgendeine Art von hack um ihn herum, aber ich bin mir nicht sicher, wie man dies, ohne explizit das ändern der Funktion nur in der Tankstelle und gibt es einen parameter, so dass ich ihn hier nennt.
Irgendwelche Tipps vielleicht?
- Private Variablen sind so konzipiert, dass nicht zugegriffen werden. Welche Art von Hausaufgaben ist!
- Let me get this straight. In einer nussschale, Ihre Aufgabe ist es, gegeben eine konkrete Klasse, die Sie nicht ändern können, speziell für den Zugang zu und ändern ein eigenes Mitglied, das keine Zugriffsfunktionen, die von außerhalb der Klassendefinition?
- Wow. Die übergabe einer bloßen Klasse Zeiger auf eine Funktion den Zugriff auf eine private var. Ick. Gibt es irgendeine Art von get () - Methode für die MaxFuel Wert, den Sie suchen oder vielleicht gibt es eine enum-oder const-Sie sind doch zu packen? Wenn diese gegeben wurde, mehrere Studenten, ich würde denken, dass würde dieses problem haben, kommen nun durch.
- Denken Sie daran, Kinder: Nur Freunde können berühren Ihre Geschlechtsteile.
- Dieser Trainer muss auf Kiel geschleppt.
- Gut, Lesen Sie Herb Sutter ' s nehmen auf es @ gotw.ca/gotw/076.htm; vor allem die "Sprache Rechtsanwalt-Lösung": -)
- zildjohn01: ja @ Dorgan: NÖ, die ganzen specs, wie gesagt, sind äußerst rar. Kein enum, keine erbschaft, kein Freund-Funktionen. @ Abhay: Danke für den link!
- also laut Sutter Artikel, Abhay wies nach, der Schlüssel (für eine standard-konforme Lösung, sowieso) ist, ob das
GasStation
- Klasse eine member-Vorlage, können spezialisiert werden. ansonsten sieht es lke, sind Sie stecken mit einer der "weniger legal" - hacks. - möglich, Duplikat der Kann ich die Transformation eines Objekts und den Zugriff auf die privaten Datenelemente in C++?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jetzt, dass klingt wie ein echt mieser Hausaufgabe.
Sowieso, kann ich mir drei Möglichkeiten zum Zugriff auf private Daten:
friend
von der KlasseBetrug:
Die ersten beiden sind legal, aber Sie benötigen, die Klasse zu wechseln. Die Letzte ist "non-intrusive" (für eine definition der "non-intrusive", eh), aber ist definitiv illegal (obwohl ich habe noch um zu sehen, einen compiler waren, es würde nicht funktionieren).
Erklären
refuel(..)
als friend-Funktion. Ansonsten sind Sie aus Glück heraus.Kompilieren und führen Sie ein test-Programm. Führen Sie es im debugger, und untersuchen Sie den Aufbau des Speichers der Tankstelle. berechnen Sie die exakte Distanz in bytes, was die Entfernung von der start einer Tankstelle auf der int gesetzt werden müssen ist (Hinweis: wenn es die erste Sache, und es gibt keine virtuellen Funktionen, die dann die Strecke garantiert auf 0 sein, so können Sie auslassen, die ersten paar Schritte).
Verwenden Sie diesen Wert zum Inkrementieren der Zeiger auf die position innerhalb des Objekts, wo Sie brauchen, um die Daten als Kirill zeigt. Aber nur ein Esel--dein Lehrer hat es verdient--verwenden Sie keine symbolische Sprache hier...verwenden Sie den Wert direkt die Entfernung etwa so:
oder was auch immer 42 sein sollte, um an der richtigen Stelle.
Wenn Sie wirklich wollen, ein Hintern, ein fake-variable in Ihrer Funktion. Kompilieren und führen Sie das Programm und dann finden Sie die Entfernung, die auf dem stack zwischen diesem fake-variable und die Lage der Tankstelle-pointer-Daten. Dann tun Sie dies:
Habe ich eine entsprechend schreckliche Lösung für Ihre Lehrer ist schrecklich Zuordnung.
Offensichtlich der Sinn einer
GasStation
zu bietenGasStation::pump(Car&)
. Dies wird Dekrementierenprivate: unsigned int MaxFuel
für Sie.Das ist schmutzig, aber Sie tun können:
Nun der compiler denkt, alles in die Kopfzeile an die öffentlichkeit. Freude!
Beste Weg ist, zum hinzufügen von öffentliche member-Funktion, um
GasStation
.Etwas weniger sicher zu machen
refuel
eine friend-Funktion.Absolut nicht die sichere option ist verfügbar, wenn Sie wissen, offset Mitglied
MaxFuel
in dieser Klasse. Dann könnte man es ändern, wie folgt (DIES NIE TUN, IN der PRODUKTION CODE):*max_fuel = new_value;
?