Was ist das hier?

  • Eine Plattform von Flensburger Studenten für Flensburger Studenten
  • Ein Wiki zum Sammeln von Wissen
  • Ein Forum zum Austausch
  • Eine Wissensdatenbank zum Informatikstudium:
    • Programmieren in C, C#, PHP, Javascript, HTML, CSS
    • Datenbanken und Abfragen mit SQL
    • 2D / 3D - Gestaltung
    • Mathe, Physik, Gerätetechnik, RoBs
    • Audio- / Videotechnik
    • ...und vieles mehr

Anmelden

Warum registrieren?

Weil besser als gut!

 

Prog2 Aufgabe - this const

Aufgabe

Im Verzeichnis Vorgabenlab05 finden Sie drei Dateien:, die Klassendeklaration und -definition der Klasse Mitarbeiter und ein Anwendungsprogramm.

  • Kopieren Sie die Dateien in ein neues Projekt, übersetzen und starten Sie es.
  • Versuchen Sie, das Programm zu verstehen - die Sternchen werden vom Destruktor ausgegeben.
  • Warum werden mitten im Programm 4 Sternchen ausgegeben ?

Anmerkungen:

  • Der Default Konstruktor der Klasse Mitarbeiter initialisiert die string Attribute nicht, da aber die strings selbst Objekte sind (als Aggregate eingebettet), wird jeweils der Konstruktor der string Klasse implizit aufgerufen. Er initialisiert alle strings mit einem Leerstring.
  • Beachten Sie, dass die Methoden intensiven Gebrauch von den vorhandenen anderen Methoden machen. Die Konstruktoren verwenden z.B. die setXX() Methoden, statt die Daten direkt in die Attribute zu schreiben. Dies ist nicht nur ’gute Programmierpraxis’, sondern erspart auch eine Menge Arbeit und Ärger: in den setXX() Methoden sind bereits Prüfungen eingebaut, die sonst nochmals implementiert werden müssten (’Wiederverwendung’). Derartige doppelte Implementierungen sind besonders fatal, wenn später Programmänderungen vorgenommen werden sollen, z.B. wenn die o.g. Prüfungen geändert werden.

Erweiterung des Projekts

Die Mitarbeiter Klasse soll um eine Vergleichsfunktion aelter mit folgendem Prototyp erweitert werden:

C++
const Mitarbeiter& aelter( const Mitarbeiter& mitarb ) const;

Diese Methode vergleicht 2 Mitarbeiter Objekte ('dieses Objekt' mit dem mitarb-Objekt) bezüglich des Attributs Alter und liefert das ältere der beiden Objekte als Funktionsergebnis (das gesamte Objekt).

Da die Methode die Objekte nicht ändert, wurde sie gleich als const Methode angelegt. Der Rückgabewert und der Parameter sind Referenzen auf konstante Objekte.

Anleitungen

  • Meldung aus Destruktor auskommentieren oder entfernen
  • alle drei getXX() Methoden und ausgeben() in const Methoden umwandeln
  • Methode aelter(...) implementieren

Hinweis: der this pointer kann dereferenziert werden

Test

Schreiben Sie ein neues Anwendungsprogramm:

  • mehrere Mitarbeiter Objekte instanziieren (Alter unterschiedlich)
  • die/den älteren von 2 MitarbeiterInnen ausgeben mit z.B.:
C++
cout << "Der aeltere der Mitarbeiter huck und josef ist:n";
huck.aelter(josef).ausgeben();

weil das Methodenergebnis eine Referenz auf ein Mitarbeiter Objekt liefert, muss eine Ausgabe folgender Art auch möglich sein:

C++
cout << "Der aelteste der Mitarbeiter "
<< "franz, josef, huck, lara und moritz ist:n";
franz.aelter(josef.aelter(huck.aelter(lara.aelter(moritz)))).ausgeben();

Lösung

this_const.cpp
Hier drin steht das main()-Programm zum testen der neuen const-Methode.
this_const.cpp
Mitarbeiter.h
Header Datei. Hier musste das const-Methode deklariert werden.
Mitarbeiter.h von Samsung
Mitarbeiter.h von Sinsonoor
Mitarbeiter.cpp
In dieser Datei wird die o.g. Methode definiert.
Mitarbeiter.cpp von Samsung
Mitarbeiter.cpp von Sinsonoor

Methode aelter()

Im Grunde ist diese neue Methode ganz einfach zu erstellen. Mit diesem Prototyp

C++
const Mitarbeiter& aelter( const Mitarbeiter& mitarb ) const;

kann folgende Funktion definiert werden:

C++
const Mitarbeiter& Mitarbeiter::aelter( const Mitarbeiter& mitarb ) const
{
	// Programmcode ...
}

Man beachte hierbei den Unterschied zum Prototypen! Um den Compiler mitzuteilen, wo er die Funktion aelter()' findet, wird mit dem Bereichsgültigkeitsoperator (Scope, "::") die Klasse, in der sich die Funktion befindet, genannt.

Innerhalb der Funktion kann jetzt über die übergebene Variable mitarb, die ja auf ein Objekt der Klasse Mitarbeiter zeigt, dessen Attribut alter'# angefragt werden und mit dem eigenen (this) verglichen werden:

C++
if(this->alter > mitarb.alter)
	return *this;
else
	return mitarb;
 

Dieses Stück Code sagt also:

"Wenn mein eigenens (this) Attribut alter größer (>) ist als das Attribut alter des übergebenen Objekts mitarb, gib einen Pointer (*this) auf mich selbst zurück, sonst den pointer auf das übergebene Objekt."

Das bedeutet, dass diese Funktion immer einen Pointer auf das Objekt zurückgibt, in welchem das Attribut alter höher ist.


Kategorie: Programmieren2
| Mehr

Zahlen & Daten

  • 799 Seitenaufrufe
  • 1116 Tage alt
  • 8 Versionen
  • Letzte Änderung: 29.04.2009 um 17:11 Uhr

Publish