Wiso wird Konstruktor nicht ordnungsgmäs ausgeführt.



  • Hallo Miteinander ich stehe vor einem für mich unbegreiflichen Problem 😮

    Wiso wird keine Werte zuweisung ausgeführt 😕

    Der Konstruktor wird zwar aufgerufen aber die Werte nicht zugewisen

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    #include <iostream>
    
    using namespace std;
    
    //Klassendeklarationen
    
    class CFahrzeuge
    {
      protected:
       int m_Tank;
       int m_Energie;
       float m_fGeschwindigkeit;
      public:
       void Patrouliere() {cout << "Fahrzueg Patrouliert\n";}
       void Bewache() {cout << "Fahrzueg Bewacht\n";}
    };
    
    class CPanzer : public CFahrzeuge
    {
       private:
         int  m_raketen;
       public:
          CPanzer()
          {
             m_raketen = 10;
             m_Tank = 1000;
             m_Energie = 133;
          }
       void Schiesse()
       {
          m_raketen--;
          cout << "Schuss Abgefeuert Sie haben noch: " << m_raketen << "Zur Verfuegung\n";
       }
       void Test()
       {
       cout << m_raketen << endl;
       cout << m_Energie << endl;
       }
    };
    
    class CTransporter : public CFahrzeuge
    {
       private:
         int m_Plaetze;
       public:
          CTransporter()
          {
             m_Plaetze = 20;
             m_Tank = 1000;
             m_Energie = 133;
          }
       void BeLaden()
       {
          m_Plaetze--;
          cout << "Person Aufgeladen es hat noch: " << m_Plaetze << "Zur Verfügung\n";
       }
    };
    
    //Funktionen
    
    void ZeigeMenue();
    void MakePanzer(int &PanzerCount);
    void MakeTransporter();
    void ZeigerArmee();
    
    int main()
    {
    ZeigeMenue();
    
    }
    void ZeigeMenue()
    {
      char Wahl;
      int PanzerCount = 0;
      do
      {
         cout << "Hell Armes V 1.2\n";
         cout << "------------------\n";
         cout << "Neues Fahrzeug erstellen:\n";
         cout << "(P)anzer\n";
         cout << "(T)ransporter\n";
         cout << "(E)ende\n";
         cout << "(I)nformationen";
         cout << "Wahl:";
         cin >> Wahl;
         switch (Wahl)
         {
            case ('P'):
            case ('p'):
            {
               MakePanzer(PanzerCount);
            }break;
         }
      } while(Wahl != 'E' && Wahl != 'e');
    }
    
    void MakePanzer(int &PanzerCount)
    {
    PanzerCount ++;
    CPanzer *pPanzer = NULL;
    pPanzer = new CPanzer[PanzerCount];
    pPanzer[PanzerCount].Test();
    pPanzer[PanzerCount].Schiesse();
    pPanzer[PanzerCount].Bewache();
    }
    //---------------------------------------------------------------------------
    


  • pPanzer = new CPanzer[PanzerCount];  
    pPanzer[PanzerCount].Test();      // den panzer gibt's nicht du hast einen weniger angelegt
    


  • Nicht ein Panzer weniger wurde erzeugt, sondern die Indizierung falsch gewählt: Ein Feld mit n Werten besitzt die Indizes 0 bis n-1. Durch

    pPanzer[PanzerCount].Test();
    

    wird dann hinter dem eigentlichen Array zugegriffen, in Java würde das zu einer ArrayIndexOutOfBoundsException führen. Bei den einfachen PointerArrays in C++ wird jedoch kein RangeChecking durchgeführt und man liest/schreibt einfach in Speicherbereichen, in denen womöglich was ganz anderes liegt, was dann zu herrlichen Fehlern führen kann...



  • Aconcagua schrieb:

    Nicht ein Panzer weniger wurde erzeugt, sondern die Indizierung falsch gewählt: Ein Feld mit n Werten besitzt die Indizes 0 bis n-1.

    Und wo ist da der Unterschied ???



  • Du erzeugst n Panzer, auf die du anschließend mit "pPanzer[0]" bis "pPanzer[PanzerCount-1]" zugreifen könntest - das Element "pPanzer[PanzerCount]" liegt direkt hinter dem Array und enthält bestenfalls Datenmüll (im schlimmsten Fall greifst du auf Daten zu, die einem anderen Objekt gehören).


Anmelden zum Antworten