hilfe beim erzeugen und löschen von klassen in funktionen
-
also habe folgendes problem
habe im header eine klasse definiertclass 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;)