hilfe beim erzeugen und löschen von klassen in funktionen



  • also habe folgendes problem
    habe im header eine klasse definiert

    class Lebewesen 
            { 
            }; 
    
    class Gegner:public Lebewesen 
            { 
            int tregheit; 
            int schritte; 
            public: 
            int posx; 
            int posy; 
            }; 
    Gegner *feind[];
    

    so nun möchte ich diesen "fein" im cpp erzeugen lassen.
    also hab ich dortfolgendes geschrieben.

    int monsterzahl; //anzahl der monster 
    feind=new Gegner[monsterzahl];
    

    klappt auch alles soweit.

    jetzt möchte ich das aber in einer funktion aufrufen und dort zuvor alle bereits erstellten feinde löschen.
    z.b.

    gegnererschaffen(int z) 
    { 
    delete Spielfeld->feind; 
    Form1->feind=new Gegner[monsterzahl]; 
    }
    

    dort bring der compiler aber nur 3 fehlermeldungen für die zeile
    Form1->feind=new Gegner[monsterzahl];

    E2303: Typname erwartet 
    E2034: Konventieren von 'int *' nach 'TSpielfeld::Gegner' nicht möglich 
    E2379 In Anwendung fehlt ;
    

    kann mir jemand sagen was ich falsch gemacht habe? danke schonmal für eure hilfe



  • Da du einen Array-Pointer hast musst du new[] und delete[] verwenden, um den Speicher zu allokieren!

    EDIT:
    Und nach new[] darfst du keinen Array-Index bei Gegner angeben (da gehört einzig und allein der Constructor hin!).

    Oder du durchläufst dein Array mit einer For-Schleife und weißt jedem Array-Element seinen Speicher einzeln zu:

    for(int cnt = 0; cnt < monsterzahl; cnt++)
         Form1->feind[cnt] = new Gegner();
    


  • und löschen tu ichs dann so?

    delete Spielfeld->feind[cnt];
    

    ???

    dann bringt der aber auch nur fehlermeldungen 😞
    kann es sein das ich dann im header noch was ändern muss?
    fehler waren:
    **E2157 Für das Löschen eines Objekts ist genau eine Umwandlung in einen Zeigeroperator erforderlich.
    E2303 Typname erwartet
    E2034 Konvertierung von 'int *' nach 'TSpielfeld::Gegner' nicht möglich
    E2379 In Anweisung fehlt ;
    **

    kannst du mir bitte mal des andere mitem beispiel erklären??
    bzw dann sagen wei ich drauf zugrei wenn ich doch kein Array-Index mitgeb??



  • also hab nun in der cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    gegnererschaffen(int z);
    int monsterzahl=0;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
    gegnererschaffen(2);
    }
    //---------------------------------------------------------------------------
    
    gegnererschaffen(int z)
    {
    for(int cnt = 0; cnt < monsterzahl; cnt++) //löscht bisherige erstellte gegner
       {
       delete Form1->feind[cnt];
       }
    for(int cnt = 0; cnt < z; cnt++)          //erschaft neue gegner
       {
       Form1->feind[cnt] = new Gegner();
       }
    monsterzahl=z;
    return 0;
    }
    

    nun kommen aber immernoch als fehler:
    **
    [C++ Fehler] Unit1.cpp(34): E2303 Typname erwartet
    [C++ Fehler] Unit1.cpp(34): E2034 Konvertierung von 'int *' nach 'TForm1::Gegner *' nicht möglich
    [C++ Fehler] Unit1.cpp(34): E2379 In Anweisung fehlt ;
    **



  • Hi,
    kannst du mal pls. die Headerfile zeigen? Hast du die Klasse Gegner innerhalb oder außerhalb von Form1 definiert?

    MfG

    Alexander Sulfrian



  • so ises in der headerdatei drin 😕
    muss ich evtl die funktion da rein ne oder???

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            void __fastcall FormActivate(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
            class Lebewesen
            {
            };
    
            class Gegner:public Lebewesen
            {
            int tregheit;
            int schritte;
            public:
            int posx;
            int posy;
            };
           Gegner *feind[];
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    


  • Hallo

    entweder verlagerst du die Deklaration von Lebewesen und Gegner aus TForm1, oder du nimmst auch gegnererschaffen(int z) als Member von TForm1 auf.

    bis bald
    akari



  • Das wäre eine Möglichkeit. Die Andere ist die Erzeugung dahin zu ändern

    Form1->feind[cnt] = new TForm1::Gegner;
    


  • oh danke nun gehts soweit 😃

    hab mich für die sache mit der anderen erzeugung entscheiden.

    kann mir jemand sagen wie ich da dann drauf zugreifen kann???

    for(int cnt = 0; cnt < z; cnt++)          
       {
       Form1->feind[cnt].tregheit = 2;
       }
    

    oder muss ich das nun auch anders angehen?

    [C++ Fehler] levellaufen.cpp(183): E2294 Auf linker Seite der Struktur ist . oder . erforderlich.*



  • Hallo

    da du die Instanzen per Pointer ansprichst, must du

    Form1->feind[cnt]->tregheit = 2;
    

    schreiben.

    bis bald
    akari



  • danke geht auch=)

    nachdem ich nun aber über

    for(int cnt = 0; cnt < z; cnt++)
       {
       Form1->feind[cnt]->tregheit = 2;
       }
    

    daten zugewiesen hab gibts ne fehlermeldung wenn ich mein programm schliese dann schriebt der irgendwas raus von wegen

    "Im projekt xyz xyz.exe ist eine Exception der klasse EAccessViolation aufgetreten. Meldung: 'zugriffsverletzung bei Adresse 00000017 lesen von adresse 00000017' prozeß wurde angehalten. mit einzelne anweisung oder start fortsetzen"

    habs versucht indem ich zuvor alles wieder löschen lass also mit

    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    for(int cnt = 0; cnt < monsterzahl; cnt++)
       {
       delete Form1->feind[cnt];
       }
    }
    

    aber geht immernoch net 😕



  • Hallo

    Versuch mal
    [cpp]TForm1::FormDestroy(TObject *Sender)
    {
    ...
    delete feind[cnt];
    [/cpp]
    Lass in Methoden von Formen immer dem Formennamen weg!

    bis bald
    akari



  • ok danke werds mir merken aber geht immernoch net 😕
    fehler bleibt:/



  • ok habs schon gefunden muste im header in der '[]' klammer nen wert eintragen dann gehts;)


Anmelden zum Antworten