abstrakte klassen und dynamische bindung



  • hallo leute,

    ich muß in diesen code eine abstrakte klasse und eine dynamische bindung einfügen. kann mir da jemand was zu schreiben wie man das macht.

    vielen vielen dank daniel

    ps.hoffe es ist nicht zuviel code 🙂

    #include <iostream.h>
    #include <stdlib.h>
    #include <string.h>
    using namespace std;
    
    class LISTE {
       protected:  
         friend class KONTO;
           char vorfalltext[20];
           double betrag;
           struct LISTE * next;
    public:
           LISTE() {}
          // void dummyL () = 0;
          // ~LISTE ();
    };
    /*------------------------------------------------------------*/
    class KONTO {
       protected:
        friend class GIRO;
        friend class SPAR;
        friend class PERSON;
         char kto_nr[10];
         long int blz;
         double guthaben;
         LISTE * ptr;
    
         int empty() 
         {
            return ptr == 0;
         }
       void add_vorfall( char text[20], double b ) 
         {
           LISTE * lptr= new LISTE;                
            lptr->betrag=b;                 
            lptr->next=0;
            strcpy(lptr->vorfalltext, text );
            if ( empty() )
              ptr = lptr;
            else {
            LISTE * p = ptr;    
            while ( p->next!=0 )
              p = p->next;
            p-> next = lptr;
            }
          }
       public:
         KONTO ( char KNr[10]="999999999", long int BLZ=81050555, double haben=0.0 );
        virtual void print();
        virtual void set();
        virtual double get();
        virtual void gutschrift( double zugang);
        virtual void abheben ( double abgang );
        virtual void ueberweisung( double betrag, KONTO &zielkto ); 
        virtual void print_vorfaelle( );
         ~KONTO () {}
    };
    void KONTO::print_vorfaelle( )
    {
       LISTE * lptr = ptr;
       if (!empty()) {                   
          while(lptr != 0) {  
             cout << "Transaktion: " << lptr->vorfalltext << "\tBetrag: " << lptr->betrag << endl;
             lptr = lptr->next;     
          }
       }
       else
          cout << "Fehler: Liste leer!" << endl;
    }
    /*------------------------------------------------------------*/
    class SPAR: public KONTO {
       protected:
         double zins;
         int laufzeit;
       public:
         SPAR ( char * KNr, long int blz=2107778, double haben = 0., double prozent = 1.75, int zeit = 1 )
         : KONTO(KNr, blz, haben), zins(prozent), laufzeit(zeit) {}
        virtual void set ();
        virtual void print ();
         ~SPAR () {}
    };
    /*------------------------------------------------------------*/
    class GIRO: public KONTO {
       protected:
         double dispo;
         public:
         GIRO ( char * KNr, long int blz=2107778, double haben = 0., double kredit=0.)
         : KONTO (KNr, blz, haben), dispo(kredit) {}
        virtual void set ();
        virtual void print ();
         ~GIRO () {}
    };
    /*------------------------------------------------------------*/
    class ADRESSE {
       protected:
        friend class PERSON; 
         char strasse[30];
         char hausnr[5];
         char PLZ[5];
         char ort[20];
    
       public:
         ADRESSE( char str[30] =" " , char hnr[5] =" " , char plz[5] ="24149" , char stadt[20] = "Kiel"  );
        virtual void set ();     
        virtual void print ();
         ~ADRESSE () {}
    };
    /*------------------------------------------------------------*/
    class TELEFON {
       protected:
         friend class PERSON;
         char laenderkennung[4];
         char ortsvorwahl[6];
         char telefonnr[10];
    
       public:
         TELEFON( char kennung[4]="0049", char vorwahl[6]="0431", char telnr[10]="1" );     
        virtual void set ();
        virtual void print ();     
         ~TELEFON () {}
    };
    /*------------------------------------------------------------*/
    class PERSON: public ADRESSE, public TELEFON, public KONTO {
       protected:
          char vorname[10];
          char name[15];
          int alter;
    
       public:
          PERSON() {}
          PERSON ( char vname[10], char nme[15], char strasse[30], char hausnr[5], char tlnr[10], char KNr[10], 
                   char plz[5]="24149", char std[20]="Kiel", char kenn[4]="++49", char vorw[6]="0431", int alt=18, 
                   long int BLZ=2107778, double haben=0.);   
         virtual void set ();     
         virtual void print ();
          ~PERSON () {}
    };
    /*------------------------------------------------------------*/
    class FAHRZEUG {
       protected:
          char marke[15];
          char name[10];
          char kraftstoff[10];
          double verbrauch;
          int leistung;
          int hoechstgeschwindigkeit;
          char kennzeichen[10];
    
       public:
         FAHRZEUG(char m[15], char n[10], char kraft[10], double verbr, int leist, int hoechstgeschw, char kennz[10]);
        virtual void set ();
        virtual void print ();
         ~FAHRZEUG () {}
    };
    /*------------------------------------------------------------*/
    class PKW:public FAHRZEUG {
       protected:
         int anzahl_sitzplaetze;
         int kofferraumvolumen;
    
       public:
          PKW ( char mark[15], char nam[10], double verbr, int leist, int hoechstgeschw, char kennz[10], 
                int koffvolumen, int sitzpl=5, char kraftst[10]="Diesel");
         virtual void set ();
         virtual void print ();
          ~PKW () {}
    };
    /*------------------------------------------------------------*/
    class LKW:public FAHRZEUG {
       protected:
         int ladevolumen;
         double zul_gesamtgewicht;
    
       public:
        virtual void set ()
         {
           FAHRZEUG::set ();
           cout << endl << "Ladevolumen: ";
           cin >> ladevolumen;
           cout << "Zulaessiges Gesamtgewicht: ";
           cin >> zul_gesamtgewicht;
         }
         virtual void print ()
         {
           FAHRZEUG::print ();
           cout << "Ladevolumen: " << ladevolumen << endl;
           cout << "Zulaessiges Gesamtgewicht: " << zul_gesamtgewicht << endl;
         }
    
         ~LKW () {}
    };
    /*------------------------------------------------------------*/
    class MOTORRAD:public FAHRZEUG {
       protected:
         int anzahl_sitze;
       public:
        virtual void set ()
         {
           FAHRZEUG::set ();
           cout << endl << "Anzahl der Sitze: ";
           cin >> anzahl_sitze;
         }        
           virtual void print ()
         {
           FAHRZEUG::print ();
           cout << endl << "Anzahl der Sitze: " << anzahl_sitze;
         }
           ~MOTORRAD () {}
    };
    /*-----------------------konto---------------------------------*/
    KONTO::KONTO ( char KNr[10], long int BLZ, double haben )
    {
       strcpy( kto_nr, KNr);
       blz = BLZ;
       guthaben = haben;
    }
      /*------------------------------------------------------------*/
       void KONTO:: print() 
    {
      cout << "\nKontodaten" << endl;
      cout << "==========" << endl;
      cout << "Kontonummer: " << kto_nr << endl;
      cout << "Bankleitzahl: " << blz << endl;
      cout << "Guthaben: " << guthaben << endl;
      return;
    }
    /*------------------------------------------------------------*/
    void KONTO:: set() 
    {
      cout << "\nBitte geben Sie die Kontonummer ein: ";
      cin >> kto_nr ;
      cout << "Bitte geben Sie die Bankleitzahl ein: ";
      cin >> blz;
      cout << "Bitte geben Sie das Startkapital ein: ";
      cin >> guthaben;
      ptr=0;
      add_vorfall( "Anfangsguthaben", guthaben );
    }
      /*------------------------------------------------------------*/
    double KONTO:: get() 
    {
      return guthaben;
    }
    /*------------------------------------------------------------*/
    void KONTO:: gutschrift( double zugang) 
    {
       guthaben += zugang;
       add_vorfall( "Einzahlung     ", zugang );
       return;
    }
    /*------------------------------------------------------------*/
    void KONTO:: abheben ( double abgang ) 
    {
       guthaben -= abgang;
       add_vorfall( "Abheben     ", -abgang );
       return;
    }
    /*------------------------------------------------------------*/
    void KONTO:: ueberweisung( double betrag, KONTO &zielkto ) 
    {
       guthaben -= betrag;
       zielkto.gutschrift( betrag );
       add_vorfall( "Ueberweisung", -betrag );
       zielkto.add_vorfall( "Eingang       ", betrag);
       return;
    }
    /*-----------------------spar--------------------------------*/
    void SPAR:: set ()
    {
       KONTO::set ();
       cout << endl << "Zins: ";
       cin >> zins;
       cout << "Laufzeit: ";
       cin >> laufzeit;
    }
    /*------------------------------------------------------------*/
    void SPAR:: print ()
    {
       KONTO::print ();
       cout << "Zins: " << zins << endl;
       cout << "Laufzeit: " << laufzeit << endl;
    }
    /*----------------------giro---------------------------------*/
    void GIRO:: set ()
    {
       KONTO::set ();
       cout << endl << "Dispo: ";
       cin >> dispo;
    }
    /*------------------------------------------------------------*/
         void GIRO:: print ()
    {
       KONTO::print ();
       cout << endl << "Dispo: " << dispo;
    }
    /*-----------------------Spar----------------------------------*/
    ADRESSE::ADRESSE( char str[30] , char hnr[5], char plz[5] , char stadt[20] )
    {
       strcpy( strasse, str );
       strcpy( hausnr, hnr );
       strcpy( PLZ, plz );
       strcpy( ort, stadt );
    }
    /*------------------------------------------------------------*/
       void ADRESSE:: set ()
    {
       cout << endl << "Strassenname: ";
       cin >> strasse;
       cout << endl << "Nr: ";
       cin >> hausnr;
       cout << endl << "PLZ: ";
       cin >> PLZ;
       cout << endl << "Ort: ";
       cin >> ort;
    }
    /*------------------------------------------------------------*/  
     void ADRESSE:: print ()
    {
       cout << endl << "Strassenname: " << strasse;
       cout << endl << "Nr: " << hausnr;
       cout << endl << "PLZ: " << PLZ;
       cout << endl << "Ort: " << ort;
    }     
    /*-----------------------telefon--------------------------------*/
    TELEFON::TELEFON( char kennung[4], char vorwahl[6], char telnr[10] )
    {
       strcpy( laenderkennung, kennung );
       strcpy( ortsvorwahl, vorwahl );
       strcpy( telefonnr, telnr );
    }
    /*------------------------------------------------------------*/ 
         void TELEFON:: set ()
    {
       cout << endl << "Laendervorwahl: ";
       cin >> laenderkennung;
       cout << endl << "Ortsvorwahl: ";
       cin >> ortsvorwahl;
       cout << endl << "Telefonnr.: ";
       cin >> telefonnr;
    }
    /*------------------------------------------------------------*/
     void TELEFON:: print ()
    {
       cout << endl << "Laenderkennung: " << laenderkennung;
       cout << endl << "Ortsvorwahl: " << ortsvorwahl;
       cout << endl << "Telefonnr.: " << telefonnr;
    }
    /*-----------------------person---------------------------------*/
    PERSON::PERSON 
    
                 ( char vname[10], char nme[15], char strasse[30], char hausnr[5], char tlnr[10], char KNr[10],
    	     char plz[5], char std[20], char kenn[4], char vorw[6], int alt,
    	     long int BLZ, double haben)
          :ADRESSE(strasse, hausnr, plz, std), TELEFON( kenn, vorw, tlnr ), KONTO( KNr, BLZ, haben ), alter(alt)
          {
             strcpy(vorname, vname); 
             strcpy(name, nme);
          }
     /*------------------------------------------------------------*/
    void PERSON:: set ()
    {
       cout << endl << "Vornamen: ";
       cin >> vorname;
       cout << "Name: ";
       cin >> name;
       cout << "Alter: ";
       cin >> alter;
       ADRESSE::set ();
       TELEFON::set ();
       KONTO::set ();
    }
    /*------------------------------------------------------------*/  
        void PERSON:: print () 
    {
        cout << endl << "Vorname: " << vorname << endl;
        cout << "Name: " << name << endl;
        cout << "Alter: " << alter << endl;
        ADRESSE::print ();
        TELEFON::print ();
        KONTO::print ();    
    }
    /*------------------------fahrzeuge-------------------------------*/
    FAHRZEUG::FAHRZEUG(char m[15], char n[10], char kraft[10], double verbr, int leist, int hoechstgeschw, char kennz[10])
    {
       strcpy( marke, m );
       strcpy( name, n );
       strcpy( kraftstoff, kraft );
       verbrauch = verbr;
       leistung= leist;
       hoechstgeschwindigkeit = hoechstgeschw;
       strcpy( kennzeichen, kennz );
    }
    /*------------------------------------------------------------*/
         void FAHRZEUG:: set ()
    {
       cout << endl << "Marke: ";
       cin >> marke;
       cout << endl << "Name: ";
       cin >> name;
       cout << endl << "Kennzeichen: ";
       cin >> kennzeichen;
       cout << endl << "Kraftstoff: ";
       cin >> kraftstoff;
       cout << endl << "Hoechstgeschwindigkeit: ";
       cin >> hoechstgeschwindigkeit;
       cout << endl << "Leistung: ";
       cin >> leistung;
       cout << endl << "Verbrauch: ";
       cin >> verbrauch;
    }
    /*------------------------------------------------------------*/
     void FAHRZEUG:: print ()
    {
       cout << endl << "Marke: " << marke;
       cout << endl << "Name: " << name;
       cout << endl << "Kennzeichen: " << kennzeichen;
       cout << endl << "Kraftstoff: " << kraftstoff;
       cout << endl << "Hoechstgeschwindigkeit: " << hoechstgeschwindigkeit;
       cout << endl << "Leistung: " << leistung;
       cout << endl << "Verbrauch: " << verbrauch;
    }
    /*-------------------------------pkw--------------------------*/
    PKW::PKW ( char mark[15], char nam[10], double verbr, int leist, int hoechstgeschw, char kennz[10], 
                int koffvolumen, int sitzpl, char kraftst[10])
          : FAHRZEUG( mark, nam, kraftst, verbr, leist, hoechstgeschw, kennz ), anzahl_sitzplaetze( sitzpl ),
            kofferraumvolumen( koffvolumen ) {}
    /*------------------------------------------------------------*/
    void PKW:: set ()
    {
       FAHRZEUG::set ();
       cout << endl << "Anzahl der Sitzplaetze: ";
       cin >> anzahl_sitzplaetze;
       cout << endl << "Kofferraumvolumen: ";
       cin >> kofferraumvolumen;
    }
    /*------------------------------------------------------------*/
    void PKW:: print ()
    {
       FAHRZEUG::print ();
       cout << endl << "Anzahl der Sitzplaetze: " << anzahl_sitzplaetze;
       cout << endl << "Kofferraumvolumen: " << kofferraumvolumen;
    }               
    /*-------------------------main-------------------------------*/
    int main() 
    {
       PERSON Klaus;
       Klaus.print();
          return 0;
    }
    

    <hume>Bitte Code-Tags verwenden!</hume>



  • @Daniel23: ich glaub wir machen e sowas ähnliches...

    ich hab eine klasse bank designed!
    bitte um comments zum code...passen meine exeptions...was könnte no verbessert werden!
    code is hier: http://www.rafb.net/paste/results/EAvMX254.html

    ich weiterer folge will ich dann noch studentenkonten, pensionskonten als vererbung erstellen, die bank soll hat dann konto, studentenkonto oder pensionskonto in die map einfügen lassen (muss halt no ein enum erstellen u dann den kontotyp der bank sagn den ich habn will)!
    wie ändere ich dann das prog...muss ich dann mit pointern auf instanzen arbeiten? und geld einzahlen in klasse konto muss dann virtual sein??

    für was sind abstrakte klassen gut, könnt ich so eine auch in meinem programm gebrauchen???

    cu surf.



  • Hallo,

    für was sind abstrakte klassen gut, könnt ich so eine auch in meinem programm gebrauchen???

    Abstrakte Klassen kann man nicht direkt instanziieren. In deinem Programm wäre z. B. eine abstrakte Klasse "Konto" denkbar. Ein Konto könnte also nicht erstellt werden, sondern nur Girokonten oder Pensionskonten, die aber von der Klasse Konto erben.

    Das hat den Vorteil, dass allen Konten bestimmte Eigenschaften "aufgezwungen" werden, aber noch zusätzliche implementieren können.

    Virtuelle Methoden deklariert man normalerweise in Basisklassen. Das macht man, wenn die Schnittstellen gleich sein sollen, aber die Implementierung in den einzelnen Subklassen anders sein kann. Wenn man die Klassen pure virtuel macht, dann müssen die Subklassen diese implementieren. Das würde dann bedeuten, dass es kein Standardverhalten gibt (also so, wie es bei einer Klasse "Konto" denkbar wäre).



  • danke erstmal,

    aber kannst du mir auch helfen wie man die abstrakten klassen da rein setzt?? bei der dynamischen bindung weiß ich es auch nicht genau wie man das macht.

    vielen dank daniel



  • danke erstmal,

    aber kannst du mir auch helfen wie man die abstrakten klassen da rein setzt?? bei der dynamischen bindung weiß ich es auch nicht genau wie man das macht.

    vielen dank daniel



  • CarstenJ schrieb:

    [...]Wenn man die Klassen pure virtuel macht, dann müssen die Subklassen diese implementieren.[...]

    Nö müssen sie nicht. Wenn du sie nicht implementierst, dann bleiben sie eben abstrakt, oder?



  • wie würde dann meien abstrakte klasse aussehen?

    konto = 0;
    

    hab ich mal wo gesehn....

    kannst du mir mal zeign wo ich virtual bei meinem prog rein tu??

    cu



  • Hallo,

    so ähnlich. Du musst mind. eine Methode der Klasse pure virtual machen:

    virtual void print() = 0; // = 0 macht die Klasse abstrakt....
    

    Damit lässt sich kein Objekt mehr direkt erzeugen.

    @Jover:
    Ja, du hast Recht.



  • CarstenJ schrieb:

    Hallo,

    so ähnlich. Du musst mind. eine Methode der Klasse pure virtual machen:

    virtual void print() = 0; // = 0 macht die Klasse abstrakt....
    

    Damit lässt sich kein Objekt mehr direkt erzeugen.

    @Jover:
    Ja, du hast Recht.

    hi CarstenJ!
    was muss ich an meiner klasse konto no verändern damit sie abstrakt wird?
    is dein mein konto nur mehr so ne art schnittstelle? versteh den sinn dafür aber net...
    cu



  • Hallo,

    wie schon geschrieben, du musst mindestens eine Klasse pure virtual machen, dann ist die Klasse abstrakt. Ich hab dir Methode "print" gewählt. Der Sinn liegt darin:

    Alle Klassen, die von Konto erben, haben die vorgegebeben Schnittstellen. Du steuerst praktisch mit der Klasse Konto alle anderen Klassen, die von ihr erben. Bevor du sowas machst, musst du dir natürlich über deine eigene Abstraktionsebene im Klaren sein. Wenn dein Programm nicht zwischen Giro-, Pensions- und Festgeldkonto unterscheiden soll, dann reicht die Klasse Konto, die auch direkt erzeugt werden kann. Du möchtest aber unterscheiden: Ein Girokonto ist ein Konto, ein Festgeldkonto ist auch ein Konto.

    Nun musst du dir darüber Gedanken machen, was ein Konto alles können muss: Man muss Geld einzahlen und abheben können. Zinsen werden ausgeschüttet, und da unterscheiden sich die einzelnen Konten aber schon in der Höhe. D. h., du musst die Zinsen für die unterschiedlichen Kontenarten anders berechnen, aber die Tatsache, dass Zinsen gezahlt werden, ist auf jeden Fall vorhanden.

    Bin jetzt etwas müde, deswegen war das wahrscheinlich nicht so extrem verständlich :). Du solltest auf jeden Fall nochmal bei Shades Tutorial vorbeigucken: http://tutorial.schornboeck.net/oop.htm



  • naja so verständlich is das nit!!
    kannst du mal eine beispiel zeigen??

    cu



  • Hoi,

    dafür gibt es wirklich genug Tutorials im Netz. Einfach mal Google bemühen.


Anmelden zum Antworten