Im folgenden eine Musterlösung zu den Teilaufgaben aus Ableitungen mit virtuellen Konstruktoren.
// Time-stamp: "(05.12.01 14:45) kiste.cpp [Klaus Wachtler]" // #include <iostream> #include <exception> #include <vector> #include <string> using namespace std; // // * * ** * // * * * // * * *** * *** // ** * * *** * * // * * * *** * **** // * * * * * * // * * * *** * *** // // class CKiste { public: CKiste( string Name = "?", double b = 0.0, double h = 0.0, double t = 0.0, string Material = "Luft" ) { this->Name = Name; this->b = b; this->h = h; this->t = t; this->Material = Material; } CKiste( const CKiste &rechteSeite ) { this->Name = rechteSeite.Name; this->b = rechteSeite.b; this->h = rechteSeite.h; this->t = rechteSeite.t; this->Material = rechteSeite.Material; } virtual CKiste *clone() const { return new CKiste( *this ); } virtual ~CKiste() { } CKiste & operator=( const CKiste &rechteSeite ) { this->Name = rechteSeite.Name; this->b = rechteSeite.b; this->h = rechteSeite.h; this->t = rechteSeite.t; this->Material = rechteSeite.Material; return *this; } virtual ostream &zeigdich( ostream &s ) const { s << Name << ", " << b << ", " << h << ", " << t << ", " << Material; return s; } // gibt alle Teile aus: friend ostream &operator<<( ostream &s, const CKiste &k ); protected: string Name; double b, h, t; // Breite, Höhe, Tiefe string Material; private: }; // class CKiste ostream &operator<<( ostream &s, const CKiste &k ) { return k.zeigdich( s ); } // // *** * * * // * * * * * // * * * *** * // *** *** *** * * **** * *** *** // * * * * * * * * *** * * * // * * * * * * * * * ** * * * * ** // *** *** * * **** **** ** *** *** * * ** // // class CSchubladenschrank : public CKiste { public: CSchubladenschrank( string Name = "?", double b = 0.0, double h = 0.0, double t = 0.0, string Material = "Luft", int ns = 0 ) : CKiste( Name, b, h, t, Material ) { this->AnzahlSchubladen = ns; } CSchubladenschrank( const CSchubladenschrank &rechteSeite ) : CKiste( (CKiste)rechteSeite ) { this->AnzahlSchubladen = rechteSeite.AnzahlSchubladen; } virtual CSchubladenschrank *clone() const { return new CSchubladenschrank( *this ); } virtual ~CSchubladenschrank() { } CSchubladenschrank & operator=( const CSchubladenschrank &rechteSeite ) { *(CKiste*)this = (CKiste)rechteSeite; this->AnzahlSchubladen = rechteSeite.AnzahlSchubladen; return *this; }
virtual ostream &zeigdich( ostream &s ) const { ( CKiste(*this) ).zeigdich( s ); s << ", Schubladen " << AnzahlSchubladen; return s; } // gibt alle Teile aus: friend ostream &operator<<( ostream &s, const CSchubladenschrank &k ); protected: int AnzahlSchubladen; private: }; // class CSchubladenschrank // ostream &operator<<( ostream &s, const CSchubladenschrank &k ) // { // return k.zeigdich( s ); // } // // * * * ** * * // * * * * * // * * * *** * *** *** * // ** * * * * **** * * **** * *** *** // * * * **** * * * **** * * *** * * * // * * * * * * * * * * * * * ** // * * * *** * *** *** * *** *** * * ** // // class CKleiderschrank : public CKiste { public: CKleiderschrank( string Name = "?", double b = 0.0, double h = 0.0, double t = 0.0, string Material = "Luft", int nt = 0 ) : CKiste( Name, b, h, t, Material ) { this->AnzahlTueren = nt; } CKleiderschrank( const CKleiderschrank &rechteSeite ) : CKiste( (CKiste)rechteSeite ) { this->AnzahlTueren = rechteSeite.AnzahlTueren; } virtual CKleiderschrank *clone() const { return new CKleiderschrank( *this ); } virtual ~CKleiderschrank() { } CKleiderschrank & operator=( const CKleiderschrank &rechteSeite ) { *(CKiste*)this = (CKiste)rechteSeite; this->AnzahlTueren = rechteSeite.AnzahlTueren; return *this; } virtual ostream &zeigdich( ostream &s ) const { ( (CKiste)*this ).zeigdich( s ); s << ", Türen " << AnzahlTueren; return s; } // gibt alle Teile aus: friend ostream &operator<<( ostream &s, const CKleiderschrank &k ); protected: int AnzahlTueren; private: }; // class CKleiderschrank // ostream &operator<<( ostream &s, const CKleiderschrank &k ) // { // return k.zeigdich( s ); // } // // **** // * * // * * *** // **** * * * *** ** // * * **** * * * * * // * * * * * * * * * // **** **** **** * * * // // class CKistenbaum { public: CKistenbaum() { pKiste = NULL; } void setzeKiste( const CKiste &k ) { delete pKiste; pKiste = k.clone(); } void setzeUO( const CKistenbaum &uo ) { Unterobjekte.push_back( new CKistenbaum() ); Unterobjekte[Unterobjekte.size()-1]->setzeKiste( (*uo.pKiste) ); } virtual ~CKistenbaum() { delete pKiste; } void run() { if( pKiste ) { cout << *pKiste << endl; } for( size_t i=0; i<Unterobjekte.size(); i++ ) { Unterobjekte[i]->run(); } } friend ostream &operator<<( ostream &s, CKistenbaum &k );
protected: CKiste *pKiste; vector<CKistenbaum*> Unterobjekte; private: }; // class CKistenbaum ostream &operator<<( ostream &s, CKistenbaum &k ) { if( k.pKiste ) { s << *(k.pKiste); } return s; } int main( int nargs, char **args ) { // Wurzel des Baums: CKistenbaum wurzel; wurzel.setzeKiste( CKiste( "Wurzel", 500, 360, 400, "Luft" ) ); // Unterobjekte einfügen: CKistenbaum tmp; tmp.setzeKiste( (CSchubladenschrank( "Holzschrank", 80, 85, 60, "Holz", 5 ) ) ); wurzel.setzeUO( tmp ); tmp.setzeKiste( (CKleiderschrank( "dretüriger Kleiderschrank", 180, 200, 60, "Span", 3 ) ) ); wurzel.setzeUO( tmp ); tmp.setzeKiste( (CSchubladenschrank( "sieben Schubladen", 80, 85, 40, "Blech", 7 ) ) ); wurzel.setzeUO( tmp ); // alles ausgeben: wurzel.run(); return 0; } // main( int nargs, char **args )