Problem beim zugreifen auf ein Dynamisch erzeugtes Klassenobjekt



  • Hey leute,
    wie der Titel schon sagt, habe ich ein Problem.

    Ich programiere gerade ein kleines Spiel in C++ und Borland, für dieses versuche ich gerade Objekte zur Laufzeit zu erzeugen.

    Die beiden folgenden Operationen sollen (bis jetzt) jeweils mit einem Button aufgerufen werden.
    Bei der ersten Operation soll ein Dynamisches Objekt erstellt werden und die X-Koordinate mit 32 belegt werden(Enemy->setEnemyX(32)). Danach soll sie zum Test ausgegeben werden und dies Funktioniert bis hier hin auch sehr gut.

    Aber sobald ich dann mit dem zweiten Button den wert ausgeben will, also mit der zweiten Operation, dann bekomme ich: "Exception der Klassse EAcessViolation aufgetreten". Meldung: "Zugriffsverletzung bei Adresse [...]"
    und leider habe ich keine Ahnung woran das liegt. Bei google oder der FoSu hab ich auch nichts passendes gefunden. Ich hoffe ihr könnt mir helfen.

    void TSteuerung::erzeugeGegner(){
    
    TEnemy *Enemy;
    Enemy = new TEnemy;
    
    	   Enemy->setEnemyX(32);
    
    ShowMessage(Enemy->gibEnemyX());
    }
    
    void TSteuerung::zeigeGegner(){
    
    ShowMessage(Enemy->gibEnemyX());
    
    }
    

    mfg,
    mick1114


  • Mod

    Das Enemy in erzeugeGegner ist ein anderes als in zeigeGegner .



  • Und wie kann ich das erzeugen, dass es das Gleiche ist?
    Das mit Dynamischen Objekten ist Neuland für mich.

    Dazu fällt mir noch eine Frage ein, falls mein Problem oben gelöst wird:
    es wird vermutlich im späteren Code so sein, dass auf das Gegner objekt zugegriffen wird, obwohl es noch nicht existiert, kann ich dann irgentwie überprüfen ob das Objekt schon existiert?



  • Du musst das Enemy-Objekt in die Klasse packen, statt es lokal in der Funktion zu deklarieren. Sonst wird der Pointer am Ende wieder gelöscht. (Der Pointer, aber nicht das Objekt selbst!)



  • arrgh, ich bin so dumm^^
    das hat ich am Anfang so, dann war irgent ein Fehler un dann hab ich den Zeiger auch nochmal in die Operation geschreibn, aber jetz hab ich es wieder gelöscht und es geht 🙂
    Vielen Dank!

    Und jetz noch meine zweite Frage^^
    Ich hab jetz etwas rumprobiert mit "if(Enemy)" kann man ja überprüfen ob das Objekt erstellt wurde. wie kann ich das mit einem Array-Klassenobjekt machen? denn "if(Enemy[i])" funktioniert nicht.



  • Was ist ein Array-Klassenobjekt?
    TEnemy *Enemies = new TEnemy[5] -> hier kannst au auch prüfen mit if(Enemies == NULL)
    std::vector<TEnemy> Enemies; -> hier kannst du prüfen mit if(Enemies.size() == 0).

    Ich würde aber die untere Variante bevorzugen. Zudem würde ich immer mit NULL vergleichen, da man dann gleich sieht, dass es sich um einen Pointer handelt.



  • Vielen Dank,
    Es funktioniert mit der ersten Variante, die zweite Versuch ich nachher.



  • es hat sich irgentwie ein weiterer Fehler eingeschlichen:

    Enemy = new TEnemy[3]; 
    
    	  for(int i=0; i==3;i++){
    
               Enemy[i].setEnemyX(5);   
    	   Enemy[i].setEnemyY(5);
    
    	  }
    

    ich erzeuge 3 Enemy objekte und mit der Schleife sollen ihnen Koordinaten zugewiesen werden, doch wenn ich in einer anderen Operation die Koordinaten mit einer Operation zurück geben will, bekomme ich immer 0.
    Woran könnte das liegen?



  • Deine Schleifenbedingung ist falsch.



  • Danke!
    Ich glaube ich sollte es heute lassen mit programieren, wenn mir solche Fehler unterlaufen^^


Anmelden zum Antworten