Probleme mit Klassen
-
Hallo

Da ich seit diesem Semester nun von C+ auf C++ umgestiegen bin, dort aber noch ab und an Probleme habe, frage ich nun einfach mal hier nach.
Mein 1. Problem: Wir lernen derzeit die Kapselung. Dazu haben wir ein Programm erhalten, indem wir Klassen erstellen sollten und möglichst in Header-Dateien auslagern sollten.
Sofern ich nicht falsch liege, sollte man also extra eine Header-Datei, sowie eine cpp-Datei für die Klasse erstellen.
Nur wie genau beschreibe ich die Klasse in einer Header-Datei? Bei einer Funktion war es noch leicht --> z.b. float funktionsname(float variablename);
Als Beispiel vielleicht meine Klasse, die ich in einer Header-Datei auslagern möchte.class Koerper { private: float masse; float xPosition; float yPosition; float xGeschwindigkeit; float yGeschwindigkeit; float betragGeschwindigkeit, xBeschleunigung, yBeschleunigung; public: Koerper(float m) { masse = m; xPosition = 0; yPosition = 0; xGeschwindigkeit = 0; yGeschwindigkeit = 0; betragGeschwindigkeit = 0; xBeschleunigung = 0; yBeschleunigung = 0; } string text() { stringstream s; s << "(" << xPosition << "," << yPosition << ")" << endl; return s.str(); } float bewege(Vektor z, const float dt) { xBeschleunigung = z.xKraft / masse; yBeschleunigung = z.yKraft / masse; xGeschwindigkeit += dt * xBeschleunigung; yGeschwindigkeit += dt * yBeschleunigung; xPosition += dt * xGeschwindigkeit; yPosition += dt * yGeschwindigkeit; } float betrag() { betragGeschwindigkeit = sqrt(xGeschwindigkeit*xGeschwindigkeit+yGeschwindigkeit*yGeschwindigkeit); return(betragGeschwindigkeit); } };Mein 2. Problem: Auch wieder bei der Kapselung. Wir haben die Aufgabe bekommen einen bestimmten Code zu kapseln und mit einer vorgegebenen Main-Funktion dann auszuführen. In dieser Funktion ist aber ein Aufruf einer Klassen-Funktion die ich nicht ganz verstehe. Wir dürfen leider die Main-Funktion nicht verändern, müssen unseren Code also daran anpassen.
Die Main-Funktion, bzw. der Teil, den ich nicht verstehe:
kraft.mul(koerper.liefereGeschwindigkeit().betrag());Via dieser Funktion soll ich eine neue Kraft berechnen. Dabei wird als Variable der Betrag meiner Geschwindigkeiten verwendet, die in der Klasse Koerper stehen. Ich kann also das ganze auch umschreiben zu
kraft.mul(koerper.betrag());und dann als Funktion in der Klasse koerper diese Funktion verwenden:
float betrag() { betragGeschwindigkeit = sqrt(xGeschwindigkeit*xGeschwindigkeit+yGeschwindigkeit*yGeschwindigkeit); return(betragGeschwindigkeit); }Dies funktioniert auch, aber was genau ist mit dem .liefereGeschwindigkeit().betrag() gemeint? Ich kapier nicht einmal, welche Funktion dort aufgerufen wird/wie sie aufgerufen wird.
Ich hoffe ihr könnt mir bei meinen beiden Problem helfen.
mfg Sinsei
-
1. So:
// .h / .hpp struct A { void foo(); };// .cpp void A::foo() { // ... }Du sollst eine Klasse "Geschwindigkeit" erstellen, die eine Memberfunktion "betrag()" hat. Ein Objekt dieser Klasse wird dann von .liefereGeschwindigkeit() zurückgegeben.
-
Danke schon mal zu der schnellen Antwort

zu 1.
heißt also ich hab die Klasse an sich in der Header-Datei und die Funktionen, die in der Klasse sind in der .cpp-Datei?zu 2.
wenn liefereGeschwindigkeit an sich eine Klasse sein soll, würde das ganze ja so aussehen:
class Koerper { ... class liefereGeschwindigkeit { float betrag() { betragGeschwindigkeit = sqrt(xGeschwindigkeit*xGeschwindigkeit+yGeschwindigkeit*yGeschwindigkeit); return(betragGeschwindigkeit); } }; };Nur bekomm ich dann das Problem, dass ich nicht auf die Variablen in der Klasse koerper nicht mehr zugreifen kann. Fehlermeldung:
error: invalid use of nonstatic data member 'Koerper::xGeschwindigkeit'
Und laut der Main-Funktion übergeben wir ja keine Werte an die Funktion betrag:kraft.mul(koerper.liefereGeschwindigkeit().betrag());Also irgendwie blick ich beim 2. immer noch nicht ganz durch, was er überhaupt von mir will. An sich funktioniert ja das ganze Programm wenn ich das liefereGeschwindigkeit weglasse und einfach nur die Funktion betrag in die Klasse Koerper reinsetzte und später aufrufe.
mfg Sinsei
-
Sinsei schrieb:
heißt also ich hab die Klasse an sich in der Header-Datei und die Funktionen, die in der Klasse sind in der .cpp-Datei?
Ja. bzw. statische Variablen definierst du auch in der .cpp. (Deklaration in .hpp)
Sinsei schrieb:
wenn liefereGeschwindigkeit an sich eine Klasse sein soll
Nein. Die Funktion liefert ein Objekt der (von dir erstellten) Klasse "Geschwindigkeit". Diese Klasse hat eine Methode "betrag()", und die liefert float.