Objekte als Funktionsargumente


Unser nächstes Programm fügt unserem früheren Programm ENGLOBJ einige Verbesserungen hinzu. Es veranschaulicht weiterhin einige neue Aspekte der Klassen: Konstruktorüberlagerung, Definieren von Komponentenfunktionen außerhalb der Klasse und - vieleicht am wichtigsten - Objekte al Funktionsargumente. Hier ist das Programmlisting von ENGLCON.CPP:

// englcon.cpp // Konstruktoren, zeigt Objekte, die eine Komponentenfunktion verwenden #include <iostream.h> class Distance // Klasse für Englisches Maßsystem { private: int feet; float inches; public: Distance() { } // Konstruktor (keine Argumente) Distance(int ft,float in) // Konstruktor (zwei Argumente) { feet = ft; inches = in; } void getdist() // Länge vom Anwender einlesen { cout << "\nGeben Sie Feet ein: "; cin >> feet; cout << "Geben Sie Inch ein: "; cin >> inches; } void showdist() // Längenangabe anzeigen { cout << feet << "\'-" << inches << '\"'; } void add_dist(Distance,Distance); // Deklaration }; // Addieren der Längen d2 und d3 void Distance::add_dist(Distance d2,Distance d3) { inches = d2.inches + d3.inches; // Inch zusammenzählen feet = 0; // (für möglichen Übertrag) if(inches >= 12.0) // Wenn Gesamtsumme 12.0 übersteigt { inches -= 12.0; // Inch um 12.0 vermindern; feet++; // und Feet um 1 erhöhen } feet += d2.feet + d3.feet; // Feet zusammenzählen } void main() { Distance dist1,dist3; // Zwei Längenangaben definieren Distance dist2(11,6.65); // dist2 definieren und initialisieren dist1.getdist(); // dist1 vom Amwender einlesen dist3.add_dist(dist1,dist2); // dist3 = dist1 + dist2 // Längen anzeigen cout << "\ndist1 = "; dist1.showdist(); cout << "\ndist2 = "; dist2.showdist(); cout << "\ndist3 = "; dist3.showdist(); }

Das Programm beginnt damit, daß die Längenangaben auf einen Anfangswert gesetzt werden und eine vom Anwender eingegebene Länge addiert wird, um die Summe der Längen zu erhalten. Dann zeigt es alle drei Längen an:

Geben Sie Feet ein: 17
Geben Sie Inch ein: 5.75

dist1 = 17'-5.75"
dist2 = 11'-6.25"
dist3 = 29'-0"


37