Erstellung von Klassen?
lima-city → Forum → Programmiersprachen → C/C++ und D
alt
beispiel
bibliothek
buchstabe
chaos
daten
datenstruktur
frau
funktion
geruch
groen buchstaben
gre
klasse
klassen frau
mensch
operator
sen
string
vergleich
weiteres beispiel
-
Also ich habe eine relativ simple Frage, die mir jedoch einige Probleme bereitet, c++ bietet ja die M?glichkeit Klassen zu erstellen, nur welchen Vorteil bringt es mir wenn ich eine Variable oder eine Funktion public oder private in einer Klasse abspeichern kann und was bringt es mir ?berhaupt eine Klasse zu erstellen?
mfg Judge -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Schreib mal ein programm mit <10000 Zeilen ohne Klassen. Das wird gnadenlos un?bersichtlich. Au?erdem ist das ber?hmte Meispiel "Ein Auto hat einen Motor, R?der etc, ein Motor hat..." doch sehr einleuchtend.
Und zu public/private... versuch m?glichst viele Member private zu halten und wenn du Zugrif bieten willst, mach das mit set/get Funktionen. -
Wozu sind Klassen gut?
1.:
In Klassen kann man logische Strukturen implementieren, die Fehler verhindern. Beispiel:
C:
struct BLA
{
??bool bDatenDrin;
??char * pcDaten;
};
struct BLA blubb;
blubb.bDatenDrin = false;
if (bDatenDrin = true) // FEHLER!!! *1
{
??// auf daten zugreifen
}
*1 = es m?sste (bDatenDrin == true) heissen
C++:
class BLA
{
private:
??bDatenDrin;
??char * pcDaten;
public:
??BLA() { bDatenDrin = false; };
??bool Drin(void) const { return bDatenDrin; };
};
BLA blubb;
if (blubb.Drin())
{
??// auf Daten zugreifen
}
Man kann also nicht aus Versehen Daten ver?ndern, wie das zum Beispiel bei Strukturen m?glich ist. Ein weiterer Vorteil ist hier auch zu sehen. Im Konstruktor BLA() wird bDatenDrin bereits mit dem richtigen Wert initialisiert. Bei Strukturen m?sste man das f?r jede neue Instanz der Struktur einzeln die Variable setzen und da kann man es ja auch mal vergessen. In der Klasse BLA kann es nicht vergessen werden, weil bei jeder neuen Instanz die Variablen automatisch auf den gew?nschten Wert gesetzt werden.
2.:
In Klassen kann man Operatoren ?berladen
class BLA
{
public:
??BLA (int i);
??static bool operator-(BLA i1, int i2);
};
bool BLA::operator-(BLA i1, int i2)
{
??if (i2 > i1)
????return false;
??return true;
}
int Zahl1 = 100;
int Zahl2 = 200;
if ((BLA) Zahl1 - Zahl2)
{
??Zahl3 = Zahl1 - Zahl2;
}
Mit ?berladenen Operatoren kann man sich viel Arbeit ersparen. Ein weiteres Beispiel ist das ?berladen des Operators == in Klassen, die sich um Strings k?mmern. Man muss dann nicht mehr strcmp f?r Strings aufrufen und das Ergebnis mit 0 vergleichen, sondern man kann einfach zwei Strings einfach per == miteinander vergleichen.
3.:
In Klassen kann man Funktionen ?berladen
class BLA
{
public:
??static void Invert(bool * pb);
??static void Invert(int * pi);
??static void Invert(char * pc);
};
void BLA::Invert(bool * pb)
{
??if (*pb == true)
????*pb = false;
??else
????*pb = true;
}
void BLA::Invert(int * pi)
{
??if (*pi > 0)
????*pi -= *pi * 2;
??else
????*pi += *pi * 2;
}
void BLA::Invert(char * pc)
{
// hier wird der string jetzt buchstabe
// f?r buchstabe ?berpr?ft und bei einem
// grossen buchstaben daraus ein kleiner
// gemacht, bei einem kleinen ein grosser
// hab jetzt keinen bock das zu schreiben
}
Von ausserhalb sieht das so aus, als w?rde ein und die selbe Funktion verschiedene Datentypen verarbeiten k?nnen
4.:
In Klassen kann man Vererbungen implementieren und muss so mit Datenstrukturen nicht immer wieder ganz von vorne anfangen
class Mensch
{
public:
??void SetzeAlter(unsigned char Alter) { ucAlter = Alter; };
??void SetzeGroesse(unsigned char Groesse) {ucGroesse = Groesse; };
??void SetzeMundgeruch(bool Gruch) { bMundgeruch = Geruch; };
??unsigned char GetAlter(void) const { return ucAlter; };
??unsigned char GetGroesse(void) const { return usGroesse; };
??bool GetMundgeruch(void) const { return bMundgeruch; };
protected:
??unsigned char ucAlter;
??unsigned char ucGroesse;
??bool bMundgeruch;
};
class Frau : public Mensch
{
protected:
??bool bSchwanger;
};
class Mann : public Mensch
{
protected:
??bool bImpotent;
};
Mit den angef?hrten Beispielen Mensch, Frau und Mann kann man nat?rlich nicht viel anfangen. Aber es wird hoffentlich deutlich, das das sehr praktisch ist, wenn sich Objekte in Kleinigkeiten unterscheiden. Das Sch?ne ist, das die ganzen Funktionen und Membervariablen in der Klasse Mensch auch in den Klassen Frau und Mann verf?gbar sind, als w?ren sie ein Teil von ihnen. So kann man sehr spezialisierte Klassen erstellen ohne viel Arbeit zu haben.
Ich finde am hilfreichsten in Klassen, das man Daten und Funktionen, die auf diese Daten zugreifen, logisch in einer Klasse einander zuordnen und sich ggf. mit ?berladenen Operatoren die Arbeit erleichtern kann.
Wenn man ausserdem Klassen f?r Bibliotheken schreibt, die zur Weitergabe an andere Programmierer bestimmt sind, dann kann man verhindern, das Daten bestimmte oder falsche Werte annehmen. Man k?nnte (besser gesagt sollte man) zum Beispiel in der Klasse Mensch in der Funktion SetzeGroesse() erstmal ?berpr?fen, ob als Groesse nicht 0 uebergeben wird, weil das ja ein Wert w?re, der nicht sinnvoll ist. Ohne Klassen k?nnte fremde Programmierer (oder man selbst, wenn man wie im ersten Beispiel = und == verwechselt oder vergisst, das bestimmte Werte unsinnig sind) die Daten einfach manipulieren und Chaos ausl?sen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage