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).