Verständnisfrage zu KLassen < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:15 Do 05.05.2011 | Autor: | egal |
Aufgabe | #include <iostream>
using namespace std;
class kreis
{
private:
double xMP;
double yMP;
double radius;
public:
double gibFlaeche (void);
void setzeMP (double xMP, double yMP);
void setzeRadius (double r);
};
double kreis :: gibFlaeche (void)
{
return 3.14159*radius*radius;
}
void kreis :: setzeMP (double xMP, double yMP)
{
this->xMP = xMP;
this->yMP = yMP;
}
void kreis :: setzeRadius (double r)
{
radius=r;
cout<<"Radius wurde gesetzt auf: "<<r<<endl;
}
int main ()
{
double x1=0.0, y1=0.0, r1=1.0, x2=2.0, y2=3.0, r2=2.0;
kreis kreis1;
kreis kreis2;
kreis1.setzeMP(x1,y1);
kreis2.setzeMP (x2, y2);
kreis1.setzeRadius (r1);
kreis2.setzeRadius (r2);
cout<<"Flaeche kreis1: "<<kreis1.gibFlaeche ()<<endl;
cout<<"Flaeche kreis2: "<<kreis2.gibFlaeche ()<<endl;
return 0;
} |
Hallo Freunde!
Ich möchte euch ein paar Verständnisfragen stellen um sicher zu gehen, dass ich diese "Klassen-Geschichte" auch einigermaßen verstanden habe.
Die Ausgabe des obigen Codes ist folgende;
Radius wurde gesetzt auf:1
Radius wurde gesetzt auf:2
Flaeche kreis1:3.14...
Flaeche kreis2: 12.5...
so weit, so gut!!
Ich wollte nun ausprobieren, dass die Ausgabe zusätzlich sagt, welche Mittelpunkte gesetzt wurden.
Dies muss ich doch dort ausspucken lassen, wo die Methode "setzeMP" definiert wurde, richtig?
Also so hier:
void kreis :: setzeMP (double xMP, double yMP)
{
this->xMP = xMP;
this->yMP = yMP;
cout<<"Mittelpunkt wurde gesetzt auf: "<<....
}
was aber soll ich denn eingeben nach dem letzten "<<"??
zweite Frage wäre das this->xMP=xMP
Das "this" steht doch dafür, dass es keine Missverständnise gibt. Denn das erste xMP ist die Adresse eines Objekts und das zweite xMP ist das Klassenattribut
Nun das ist eine schöne Umschreibung, die ich abgeschrieben habe, nur verstehe ich das nicht, was genau dort passiert!
dritte Frage bezieht sich auf das Hauptprogramm!
ganz unten steht ja:
cout<<"Flaeche kreis1: "<<kreis1.gibFlaeche ()<<endl;
cout<<"Flaeche kreis2: "<<kreis2.gibFlaeche ()<<endl;
wieso sind denn dort zum Schluss Klammern, die vor allem leer sind???
Ziemlich viele Fragen. Hoffe ihr könnt mir helfen, auch wenn die Länge des Textes einige zum Antworten demotiviert
Gruß
|
|
|
|
Hallo!
Das
void kreis :: setzeMP (double xMP, double yMP)
{
this->xMP = xMP;
this->yMP = yMP;
}
ist ein wenig problematisch, weil xMP sowohl eine Membervariable der Klasse selbst bezeichnet, als auch einen Übergabeparameter.
'this' ist ein Zeiger auf die eigene Instanz der Klasse, und damit meint this->xMP die eigene Membervariable.
Übersichtlicher wäre es, die Übergabeparameter anders zunennen, z.B. so:
void kreis :: setzeMP (double xCenter, double yCenter)
{
xMP = xCenter;
yMP = yCenter;
}
Dennoch solltest du den Trick mit dem this kennen, weil sowas an anderer Stelle vorkommen kann.
Dann mußt du natürlich auch schreiben
cout << "Mittelpunkt wurde gesetzt auf: " << this->xMP ....
weil du ja prüfen willst, ob die Variable selbst gesetzt wurde.
Zu dem kreis1.gibFlaeche() :
gibFlaeche() ist eine Methode der Klasse, also sowas wie eine Funktion. Und die werden immer mit Klammern aufgerufen, auch wenn nix drin steht!
Theoretisch kannst du auch direkt auf die Variablen der Klasse zugreifen und ein
cout << kreis1.radius <<endl;
machen, dann müßte radius aber als public, und nicht ans private deklariert sein.
Weil das eine Variable und keine Funktion ist, geht das ohne Klammern.
Aber das ist ein schlechter Stil, auch wenn es schön einfach ist. Du solltest immer mit "Gettern" und "Settern" arbeiten, also Methoden, die die internen Variablen rausgeben oder setzen.
|
|
|
|