int main() { MyLVector c(1.000001,1.,0.,0.); MyLVector d(2.,1.,1.,0.); MyLVector e(1.000001,-1.,0.,0.); cout << "angle c, e = " << c.Angle(e) << endl; // My3Vector-Methode cout << "mass d = " << d.Mass() << endl; // MyLVector-Methode cout << "mass c+e = " << c.Mass(e) << endl; ...
Lösungsbeispiel: Header MyLVector.h, Code MyLVector.cpp, Testprogramm TLVector.cpp.
(a) Definieren Sie die deklarierten Konstruktoren jeder Klasse.
(b) Erstellen Sie eine Member-Funktion
void move (double dx, double dy, double dz) ,
die ein Particle um die angegebenen Werte in den drei Koordinaten verschiebt (also x+dx, y+dy, z+dz).
Hinweis: Überlegen Sie sich, wo diese Funktion überall deklariert/definiert werden muss,
um möglichst wenig Arbeit zu haben. Zum Test löschen Sie die Kommentarzeichen in Schleife
1 in main().
(c) Wie erreicht man, dass die Schleife 2 in
main()
immer die richtige
toString() Funktion wählt, also z.B. tatsächlich ein
Molecule ausgibt, wenn sich hinter dem
Particle*
Pointer ein solches verbirgt?
(d) Ein Chemiker möchte natürlich immer wissen, aus welchen Elementen ein Particle besteht.
Es soll also nur möglich sein, Atome und Moleküle zu erzeugen, nicht aber ein "abstraktes" Particle.
(Sorgen Sie dafür, dass die Particle-Klasse abstrakt ist.)
Ergänzung: In dem Beispiel wird bei der Klasse ChargedMolecule multiple inheritance verwendet. Das ist ziemlich heikel, insbesondere wenn, wie in dem Fall, die Vererbung auf eine gemeinsame Basisklasse zurückgeht. Eine Diskussion dazu findet sich z.B. hier
(b) Static und Dynamic Casting:
Wie zuvor source files herunter laden und versuchen zum laufen zu bringen:
(b) Nur die wenigsten physikalischen Fragestellungen lassen sich einfach lösen, auch bei vglw. simplen Problemen wird die analytische Lösung schnell ziemlich unhandlich. Ein klassisches Beispiel ist der Schiefe Wurf: Ein Ball wird mit 10 m/s geworfen, die Anfangshöhe ist 2 m, bei welchem Winkel wird die maximale Weite erreicht?
GDuckeck 2019-08-01