C++ Einführung
C++ Variablen im Speicher, Zeiger
C++ Texte etc.
C++ Dateien, Formatierte Ausgabe, ...
C++ OOP
Hilfe / Anhang
Downloads / Links
Partner
Fehler melden / Kontakt
Impressum
|
| Seite: [1] 2 3 - Drucken |
Inhalt:
Daten Strukturen: struct
Stell dir vor, du hast ein Register mit allen Autos der Straße:
- Typ
- Besitzer
- PS
- max. Geschwindigkeit
- Türen
- Klimaanlage
Bevor du jetzt anfängst, für jedes Auto eine neue Variable "Typ" anzulegen, solltest du dir Gedanken machen, ob dir keine bessere Lösung einfällt! Wie wäre es denn zum Beispiel mit dem Datentyp "automobil"?
struct automobil { std::string typ; std::string besitzer; int ps; int max_v; int tueren; bool klima; }meins,test,test2; //Anlegen von Autos (Möglichkeit 1)
Halt! Was soll das?
Wir steigen soeben in die OOP (Objektorientierte Programmierung) ein! "meins" ist zum Beispiel ein Objekt/eine Instanz der Klasse "automobil". Die OOP dient dazu, eigene Datentypen zu definieren und zu organisieren.
Die OOP hilft, Muster zu erzeugen. Der Mensch selbst typisiert Dinge immer, etwa wenn du durch die Stadt gehst und einen Porsche 911 siehst: Du siehst gleichzeitig einen Porsche, ein Auto, ein Vehikel, ein "Ding", das in der Welt existiert. Sag jemand nun "Vehikel". muss das allerdings nicht zwingend ein Porsche 911 sein, es kann alles mögliche sein. Nur die oben genannte Kette stellt einen Porsche 911 dar.
In C++ geht das genauso: Wir können ein abstraktes Bild der Wirklichkeit schaffen - eben durch die OOP.
Dabei haben Klassen (etwa Ding, Vehikel, Porsche, Porsche 911) "Eigenschaften", also eine Art lokale Variable, auch Membervariable genannt. Im obigen Beispiel wäre das zum Beispiel "klima" oder "tueren"!
Außerdem können Klassen auch Methoden haben, also interne Funktionen. Wir haben auch diese schon kennengelernt, etwa als wir uns mit Dateien beschäftigt haben:
Denn auch bei "std::fstream" handelt es sich um eine Klasse, die Methoden besitzt. Zum Beispiel "open()".
Auf die Werte einer Klasse zugreifen
Um auf die Werte einer Klasse zugreifen zu können, muss man zuerst einmal verstehen, was eine Klasse überhaupt ist!
 | Eine Klasse ist nur eine Vorlage, nach der dann Objekte erstellt werden. Genauso wie du nicht schreiben kannst: "int=0", musst du auch zuerst ein Objekt anlegen, und kannst nicht der Klasse Werte zuweisen! (also: "int i=0;") |
Also legen wir noch einmal ein - nein gleich vier - Objekte vom Typ Automobil an:
#include <iostream> #include <string> struct automobil { std::string typ; std::string besitzer; int ps; int max_v; int tueren; bool klima; }testobjekt_1,testobjekt_3; //Anlegen von Autos (Möglichkeit 1) int main() { automobil testobjekt_2,testobjekt_4; //^Anlegen von Autos (Möglichkeit 2) testobjekt_1.typ="LEPORELLO"; //LEPORELLO/LEPO->Wikipedia ;) testobjekt_2.typ="Raserati"; //Punktoperator testobjekt_3.typ="Ferfari"; testobjekt_4.typ="Popel"; testobjekt_1.ps=200; testobjekt_2.ps=500; testobjekt_3.ps=100; testobjekt_4.ps=2; std::cout << testobjekt_1.ps << " : " << testobjekt_2.ps << " : " << testobjekt_3.ps << " : " << testobjekt_4.ps << std::endl; return 0; }
Methoden - Die Memberfunktionen der Klassen
Methoden sind wie folgt aufgebaut:
- Ein Prototyp in der Klasse
- "<Rückgabetyp> <struct-name/Klassenname>::<Methodenname>(<...>)"
Natürlich kannst du auch auf den Prototypen verzichten, und den Methodeninhalt direkt in die Klassendeklaration schreiben, was meiner Meinung nach allerdings unübersichtlicher ist... (Beispiele folgen)
Was ist "this"?
Wenn du in einer Methode Eigenschaften des Objektes verwenden willst, benutzt du "this->" (s.u.). Dabei handelt es sich um einen Pointer auf das aktuelle Objekt! Mittels des Pfeils kannst du, wie auch mit dem Punktoperator Eigenschaften und Methoden eines Objektes ansprechen, allerdings über einen Pointer. Dabei sind die folgenden Zeilen gleichbedeutend:
Würdest du die Klammern vergessen, würde die "*(this.test)" gemeint...
getter und setter-Methoden (mit this)
Bei diesen Methoden handelt es sich um Methoden, die Eigenschaften auslesen und zurückgeben, bzw. solche, die Werte setzen. Dies kann nützlich sein, wenn man z.B. die Lesitung eines Autos intern in PS speichert, aber entweder mit kW (Kilowatt) oder mit PS arbeiten möchte: (1 kW=1.36 PS, 1 PS=0.736 kW)
Da getter keine Werte ändern, kann es sehr nützlich sein, sie als "const" zu definieren. So kannst du vermeiden, das ein Programmierfehler doch Werte ändert... (z.B.: "if (wert=1)"). Wie dies geschieht, kannst du unten und im Beipiel auf der übernächsten Seite sehen!
//+++++++++++++++++++++++++++++++++++++++++++++++ // ps_kw.cpp //demonstriert getter und setter //+++++++++++++++++++++++++++++++++++++++++++++++ #include <iostream> struct automobil { int ps; int get_ps() const; void set_ps(int ps); int get_kw() const; void set_kw(int kw); }; //Nix anlegen //+++++++++++++++++++++++++++++++++++++++++++++++ // main() //+++++++++++++++++++++++++++++++++++++++++++++++ int main() { automobil test; test.set_ps(200); std::cout << test.get_kw() << std::endl; return 0; } //+++++++++++++++++++++++++++++++++++++++++++++++ // automobil - Implementieren von Klassenmethoden //+++++++++++++++++++++++++++++++++++++++++++++++ int automobil::get_ps() const { return ps; } void automobil::set_ps(int ps) { this->ps=ps; } int automobil::get_kw() const { return (1.36 * this->ps); } void automobil::set_kw(int kw) { this->ps=0.736 * kw; }
public oder private (öffentlich oder privat)?
Alle Methoden und Eigenschaften, die wir bisher besprochen haben, waren öffentlich ("public"), aber es gibt auch die Möglichkeit, sie als "private" zu deklarieren. Danach können nur noch die Methoden dieser Klasse auf diese Elemente zugreifen, von außen sind sie nicht zu sehen:
//+++++++++++++++++++++++++++++++++++++++++++++++ // ps_kw.cpp //demonstriert getter und setter //+++++++++++++++++++++++++++++++++++++++++++++++ #include <iostream> struct automobil { private: int ps; public: int get_ps(); void set_ps(int ps); int get_kw(); void set_kw(int kw); }; //Nix anlegen //+++++++++++++++++++++++++++++++++++++++++++++++ // main() //+++++++++++++++++++++++++++++++++++++++++++++++ int main() { automobil test; test.set_ps(200); std::cout << test.get_kw() << std::endl; return 0; } //+++++++++++++++++++++++++++++++++++++++++++++++ // automobil - Implementieren der Klassenmethoden //+++++++++++++++++++++++++++++++++++++++++++++++ //...
So kannst du Fehlerquellen einschränken! Eine dritte Möglichkeit dieser "Rechte" werden wir später behandeln!
Wie geht's weiter?
Auf der nächsten Seite geht es um Konstruktoren und Destruktoren!
|
| Seite: [1] 2 3 - Drucken |
|