Hilfe bei Polymorphie



  • Hallo!

    beim ausführen von nachfolgenden Programm bekomm ich immer bei der abschließenden ausgabe aller eingegebenen Werte einen Fehler:
    "Im Projekt XY ist eine Exception der Klasse EAccessViolation aufgetreten ..."
    Woran kann das liegen?

    thx im voraus 🙂

    dekl:
    
    #include <iostream.h>
    #include <conio.h>
    #include <string.h>
    
    class Computer
    {
    protected:
     long nummer;
    
    public:
     Computer(long);
     ~Computer();
    
     long getNummer()                                       {return nummer;}
     void setNummer(long nr)                                {nummer=nr;}
    
     virtual void eingabe();
     virtual void ausgabe() const;
    
    };
    
    class Intel : public Computer
    {
    private:
     int mhz;
    
    public:
     Intel(long, int);
     ~Intel();
    
     int getMhz()                                           {return mhz;}
     void setMhz(int m)                                     {mhz=m;}
    
     void eingabe();
     void ausgabe() const;
    
    };
    
    class Amd : public Computer
    {
    private:
     int ram;
    
    public:
     Amd(long, int);
     ~Amd();
    
     int getRam()                                           {return ram;}
     void setRam(int r)                                     {ram=r;}
    
     void eingabe();
     void ausgabe() const;
    
    };
    
    impl:
    
    #include "computer.h"
    
    Computer::Computer(long nr)
    {
    nummer=nr;
    }
    
    Computer::~Computer(){}
    
    void Computer::eingabe()
    {
    cout<<"Nummer: ";
    cin>>nummer;
    }
    
    void Computer::ausgabe() const
    {
    cout<<"Nummer: "<<nummer<<endl;
    }
    
    //////////////////////////////Intel/////////////////////////////////////////////
    
    Intel::Intel(long nr, int m):
     Computer(nr),mhz(m)
    {}
    
    Intel::~Intel(){}
    
    void Intel::eingabe()
    {
    cout<<"Nummer: ";
    cin>>nummer;
    cout<<"Mhz: ";
    cin>>mhz;
    }
    
    void Intel::ausgabe()const
    {
    cout<<"Nummer: "<<nummer<<endl;
    cout<<"Mhz: "<<mhz<<endl;
    }
    
    //////////////////////////////Amd///////////////////////////////////////////////
    
    Amd::Amd(long nr, int r):
     Computer(nr),ram(r)
    {}
    
    Amd::~Amd(){}
    
    void Amd::eingabe()
    {
    cout<<"Nummer: ";
    cin>>nummer;
    cout<<"Ram: ";
    cin>>ram;
    }
    
    void Amd::ausgabe()const
    {
    cout<<"Nummer: "<<nummer<<endl;
    cout<<"Ram: "<<ram<<endl;
    }
    
    main:
    
    #include "computer.h"
    #pragma hdrstop
    #pragma argsused
    
    int main(int argc, char* argv[])
    {
    
    Computer* pCom[20];
    int auswahl, anzahl, i;
    
    for(int i=0;i<20;i++)
    {
    
    cout<<"Bitte Wahl treffen"<<endl;
    cout<<"1 = Intel    2 = AMD"<<endl;
    
    cin
    >>auswahl;
    
    if(auswahl<1||auswahl>2)
    break;
    
    switch(auswahl)
    {
     case 1:
     pCom[i] = new Intel(123456, 2000);
     pCom[i]->eingabe();
     break;
    
     case 2:
     pCom[i] = new Amd(1234, 512);
     break;
    }
    }
    
    anzahl=i;
    
    for(i=0;i<anzahl;i++)
    {
     pCom[i]->ausgabe();
    }
     delete pCom;
    
    getch();
    return 0;
    }
    


  • Du deletest pCom, aber pCom ist ein Array auf dem Stack. Das führt zum Absturz. Du musst schon die Einträge in pCom einzeln deleten und das Aufräumen des Stacks dem normalen Gang der Dinge überlassen ...



  • Danke für die Antwort - aber wie mache ich das genau?



  • Hallo

    for(i=0;i<anzahl;i++)
    {
     delete pCom[i];
    }
    

    bis bald
    akari



  • thx 🙂

    aber der Fehler tritt immernoch auf ...



  • Mr. Blonde schrieb:

    aber der Fehler tritt immernoch auf ...

    Im main gibt es zweimal die Variable 'i'.
    Einmal hier

    int main(int argc, char* argv[])
    {
    
        Computer* pCom[20];
        int auswahl, anzahl, i; // 'i' ist hier nicht initialisiert
    

    und hier

    for(int i=0;i<20;i++)
    {
    

    nachdem die for-Schleife zu Ende ist, benutzt Du i wieder; diesmal die unitialisierte .. und da kann sonstwas drin stehen, aber wahrscheinlich nicht 20.

    Dass Du das

    delete pCom;
    

    ganz weglassen musst, hast Du schon richtig verstanden - oder?

    Gruß
    Werner


Anmelden zum Antworten