Verständnisfrage zu Klassen (mit Beispiel)
-
hi! habe folgendes verständisproblem was die anwendung von klassen anbelangt, mit fehlt irgendwie der zusammenhang zum objektorientierten, wäre nett wenn man das an folgendem beispiel erklären könnte..
#include <iostream.h> class NimmSpiel { private: int anzahlDerMuenzen; public: void zugRechner() { int wunschZug=anzahlDerMuenzen%4; if(wunschZug==0) anzahlDerMuenzen=anzahlDerMuenzen-1; else anzahlDerMuenzen=anzahlDerMuenzen-wunschZug; }; void zugMensch() { int ergebnis; cout<<"Jetzt liegen "<<anzahlDerMuenzen<<" Muenzen auf dem Tisch."<<endl; cout<<"Wieviele moechten Sie nehmen? "; cin>>ergebnis; anzahlDerMuenzen=anzahlDerMuenzen-ergebnis; }; bool gewonnen() { return anzahlDerMuenzen==0; }; void starteSpiel() { cout<<"Mit wievielen Muenzen fangen wir an? "; cin>>anzahlDerMuenzen; }; }; int main() { NimmSpiel spiel; spiel.starteSpiel(); while(true) { spiel.zugRechner(); if(spiel.gewonnen()) { cout<<"Ich habe gewonnen!"<<endl; return; }; spiel.zugMensch(); if(spiel.gewonnen()) { cout<<"Sie haben gewonnen!"<<endl; return; }; }; };
verstehe ich das richtig, dass die klasse im weitesten sinne ner art datentyp entspricht, und der aufruf von "spiel" mit ner methode zu vergleichen ist?! wenn nicht, wozu brauch ich dann das "spiel", denn das bereitet mir die größten probleme... bzw diese beiden ersten zeilen der main-funktion:
NimmSpiel spiel; spiel.starteSpiel();
danke, tom
-
Eine Klasse ist eine Art Bauplan fuer ein Objekt. Mit dem
NimmSpiel spiel;
wird ein Instanz von NimmSpiel erzeugt. Also ein Objekt NimmSpiel gebaut.
Damit kannst du dann durch die Methoden arbeiten.(Methoden sind die Funktionen fuer das Objekt, zugRechner etc.)
-
tomcat22, du musst nicht nach jeder schließenden geschweiften Klammer ein Semikolon machen. In deinem Beispiel gibt es nur eine Stelle, wo das wirklich sein muss, am Ende der Klassendeklaration
-
-
hhm, man kann eine klasse also als objekt bezeichnen, richtig? und das
spiel.starteSpiel();
ist dann ne art pointer zum benutzen davon oder was genau?
@MFK
das ist nur ein einfaches kopiertes beispiel, nicht von mir...aber schaden tuts doch auch nicht, denke ich. funzt zumindest so.
thx, tom
-
Nein, dass ist ein, zumindest in diesem Beispiel, eine ganz normale Member-Funktion der Klasse; Du verwendest sie, wie jede andere Funktion auch (nur dass sie eben eine Member-Funktion ist und sich auch dementsprechend verhält).
Pointer sehe ich da nirgends
-
Reyx schrieb:
Pointer sehe ich da nirgends
Jede ganz normale Member-Funktion, also nicht-statische Methode, bekommt automatisch einen Pointer auf das Objekt, den sie mittels des Schlüsselwortes
this
ansprechen kann. Für den Zugriff auf Member muss "this" aber nicht explizit verwendet werden, da es automatisch geschieht.
-
ahso, stimmt, ganz übersehen! danke auch für die links...
der groschen ist grad am fallen.tom
-
tomcat22 schrieb:
hhm, man kann eine klasse also als objekt bezeichnen, richtig?
Nein. Eine Klasse ist sozusagen das Kochrezept und eine Instanz davon (Objekt) ist dann das zubereitete Gericht.
-
Genau! Haette mein Bauplan bsp. noch was erweitern sollen..
-
tomcat22 schrieb:
hi! habe folgendes verständisproblem was die anwendung von klassen anbelangt, mit fehlt irgendwie der zusammenhang zum objektorientierten, wäre nett wenn man das an folgendem beispiel erklären könnte..
verstehe ich das richtig, dass die klasse im weitesten sinne ner art datentyp entspricht, und der aufruf von "spiel" mit ner methode zu vergleichen ist?! wenn nicht, wozu brauch ich dann das "spiel", denn das bereitet mir die größten probleme...
Jedes Ding der realen Welt oder auch abstrakte Dinge wie Datencontainer, Listen,... kann man als Objekt abbbilden. Der "Bauplan" für ein Objekt ist eine Klasse. Hier ist ein Objekt in deinem Programm das Spiel selbst. Bei so einem primitiven Spiel lohnt es sich nicht extra eine Klasse anzulegen, sicher hast du das auch nur zur Übung gemacht. KLassen entwerfen lohnt erst bei komplexeren Programmen, dort sieht man den Vorteil erst richtig wenn einzelne Objekte miteinander über ihre Methoden Botschaften austauschen. Dass eine Klasse einen neuen Typ definiert ist richtig. Der Unterschied ist, dass bei einer Klasse nicht nur einzelne Variablen (die Attribute) gekapselt werden sondern zusätzlich noch Methoden die nur zur jeweiligen Klasse gehören.
Viel mehr Interessantes das man über Klassen und Objekte wissen sollte,
steht in jedem besseren C++ / OOA / OOD Buch. Ich empfehle für Einsteiger die Bücher von Balzert zu dem Thema.