/**************************************************************************** * Copyright (C) 2001 FORWISS * * Bavarian Research Center for Knowledge-Based Systems * * * * Author: Robert Fenk * * * * Shows UML to C++ mapping for examples given in the lectures * ****************************************************************************/ #include #include #include using namespace std; ////////////////////////////////////////////////////////////////////////////// // Vorwaertsdeklaration class Person; // Basisklasse class Person { public: // Attribute string name; // selbstreferenzierende Assoziation // wegen Listenklasse und möglicher Änderungen als Pointer realisiert!! list Mitarbeiter; // Assoziation zurück zum Projektleiter, // wegen möglicher Änderungen als Pointer realisiert!! Person *Projektleiter; // Methoden Person(string n): name(n) { Projektleiter = NULL; } void neuerMitarbeiter(Person *m) { Mitarbeiter.push_back(m); } void neuerProjektleiter(Person *l) { Projektleiter = l; } void print() { cout << name; } }; // Vorwaertsdeklaration class Ehe; // Subklasse class Mann: public Person { public: // Attribute bool hatBart; // Assoziation mit Ehe (kann sich ändern => Pointer)!! Ehe *ehe; // Methoden Mann(string aName, bool aHatBart): Person(aName) { hatBart = aHatBart; } void print(); }; // Subklasse class Frau: public Person { public: // Attribute float haarLaenge; // Assoziation mit Ehe (kann sich ändern => Pointer)!! Ehe *ehe; // Methoden Frau(string aName, float aHaarLaenge): Person(aName) { haarLaenge = aHaarLaenge; } void print(); }; // Subklasse Mehrfachvererbung class Zwitter: public Mann, public Frau { public: // Methoden Zwitter(string aName, bool aHatBart, float aHaarLaenge): Mann(aName, aHatBart), Frau(aName, aHaarLaenge) { } void print() { cout << Mann::name << " " << hatBart << " " << haarLaenge; // name ist nicht eindeutig!!!!! // cout << name << " " << hatBart << " " << haarLaenge; } }; // Komponente von Ehe class Eheurkunde { public: int TagHeirat; // Rueckreferen zur Ehe Ehe *ehe; // Methoden Eheurkunde(Ehe *aEhe, int aTagHeirat): TagHeirat(aTagHeirat) { ehe = aEhe; }; }; class Kind: public Person { public: // enfache Assoziation (Rückreferenz zur Ehe) Ehe *ehe; // Methoden Kind(string aName, Ehe *aEhe): Person(aName) { ehe = aEhe; } }; // attributierte Assozationsklasse class Ehe { public: // Attribute int AnzahlKinder; // einfache Assoziation, kann sich nicht ändern => Referenz Mann &mann; Frau &frau; // PART OF: NICHT existentiell!!! list Kinder; // PART OF: existentiell!!! Eheurkunde urkunde; // Methoden Ehe(Mann &aM, Frau &aF, int aTagHeirat): mann(aM), frau(aF), urkunde(this, aTagHeirat) { AnzahlKinder = 0; mann.ehe = this; frau.ehe = this; } void print () { cout << "Mann " << mann.name << " und " << "Frau " << frau.name << " haben am " << urkunde.TagHeirat << " geheirated und " << AnzahlKinder << " Kinder"; } }; void Mann::print() { Person::print(); cout << " " << hatBart; if (ehe) { cout << ": "; ehe->print(); } } void Frau::print() { Person::print(); cout << " " << haarLaenge; if (ehe) { cout << ": "; ehe->print(); } } //**************************************************************************** int main(int argc, char *argv[]) { Person p("Unperson"); Mann m("Adam", false); Frau f("Eva", 20); Zwitter z("Schlange", true, 10); p.print(); cout << endl; m.print(); cout << endl; f.print(); cout << endl; z.print(); cout << endl; Ehe ehe(m,f,123456); m.print(); cout << endl; f.print(); cout << endl; return 0; }