dynamische klassen???



  • Den Konstruktor kannst du hier getrost weglassen. Weiterhin ist
    einheit nr[5]; natürlich auch möglich. Bei dynamischen Feldern könnte man auch
    std::vector<einheit> nr; oder so verwenden. Es gibt viele Möglichkeiten. Auf new und delete würde ich bei Anfängern erst mal verzichten.



  • wie kann ich des nun machen das ich die lösungsmöglichkeit nr 3 als element von form1 erstellen kann also vonem 2. form mit Form1->nr[1]. ...
    zugreifen aknn



  • Hallo

    über die FAQ im Abschnitt Forms findest du zum Thema Variablenübergabe an anderes Form dieses Thread
    http://www.c-plusplus.net/forum/viewtopic.php?t=39242

    bis bald
    akari



  • ja aber was davon muss ich nun in die headerdatei schreiben und was in die cpp???weisl der in der headerdatei z.b. des conast int.. udn so net annimmt.?
    abber wenn ichs in die cpp schrieb kann ich die net in der :h erzeugen odeR??

    const Zahl 50; 
    
    class einheit 
    { 
      int lebenspunkte; 
      String Name; 
      einheit() {}; // Konstruktor 
    }; 
    
    einheit *nr3[Zahl]; // Feld mit dynamischen Objekten 
    for (int Lv = 0; Lv < Zahl; Lv++) // Dynamische Objekte erstellen 
      nr3[Lv] = new einheit();
    

    die ganze zeit wies noch nicht dynamisch was hatte ich alles in der headerdatei drin

    class einheit 
    { 
      int lebenspunkte; 
      String Name; 
      einheit() {}; // Konstruktor 
      }; 
    
    einheit nr31;
    einheit nr32;
    einheit nr33;
    ...
    


  • versuch mal in .h

    DynamicArray <einheit*>EinheitNr;
    

    in der .cpp

    for (int x = 0; x< AnzahlEinheiten;x++)
    {
       EinheitNr.Length++;
       EinheitNr[x] = new einheit();
    }
    

    aber natürlich beim schliessen des programms/ der form

    for (int x = AnzahlEinheiten; x >0 ;x--)
    {
       delete EinheitNr[x];
       EinheitNr.Length--;
    }
    

    ist ungetestet.. hoffe mal es funktioniert und ich habe richtig verstanden was du willst.. 😃



  • geht leider auch net 😞
    zeigt dann nur ne fehlermeldung:
    *[C++ Fehler] Unit1.cpp(20): E2285 Keine Übereinstimmung für 'TForm1::einheit::einheit(TForm1 )' gefunden



  • Da stimmen wohl Definition und Deklaration des Konstruktors deiner Klasse einheit nicht überein.
    Wenn die hier gezeigte Deklaration vollständig ist, kannst den Konstruktor von Einheit weglassen (wie oben schon gesagt).
    Warum willst du die Instanzen von einheit unbedingt dynamisch verwalten (sprich Pointer davon)? Auch das ist nicht unbedingt nötig.
    folgendes sollte auch reichen

    DynamicArray <einheit> EinheitNr;
    EinheitNr.Length = AnzahlEinheiten;
    

    Dann brauchst du auch kein delete.
    Wenn die Anzahl der Einheiten sich später nicht ändert, reicht auch ein statisches Array.



  • würde das ganze schon gerne so in etwa angehen da dann der zugriff auf die einzelnen objekte leichter ist

    const int Zahl=50;
    
    class einheit
    {
      int lebenspunkte;
      String Name;
      einheit() {}; // Konstruktor
    };
    
    einheit *nr3[Zahl]; // Feld mit dynamischen Objekten
    for (int Lv = 0; Lv < Zahl; Lv++) // Dynamische Objekte erstellen
      nr3[Lv] = new einheit();
    

    doch selbst hier bringt der schon folgenden fehler raus:
    **
    [C++ Fehler] Unit1.cpp(32): E2247 Zugriff auf 'einheit::einheit()' nicht möglich**

    wie kann ich den fehler beheben?
    und mm was muss ich tun um aus dem ganzen ein element von form1 zu machen ?
    einfch beim ertellen:

    nr3[Lv] = new einheit(Form1);
    

    machen????



  • Wiso ist dann der Zugriff auf die Elemente leichter?
    Wie gesagt lass den Konstruktor weg. Wenn du unbedingt dynamisch erstellen willst reicht doch

    for (int Lv = 0; Lv < Zahl; Lv++) // Dynamische Objekte erstellen
      nr3[Lv] = new einheit;
    

    völlig aus.
    Wenn das hier
    einheit *nr3[Zahl];
    im Header Unit1.h im public-Bereich von TForm1 deklariert ist, dann ist deine Variable nr3 doch schon ein Teil von TForm1.
    Lies die bitte noch mal den anfangs angegebenen FAQ-Beitrag durch.
    Desweiteren vielleicht auch den http://www.c-plusplus.net/forum/viewtopic.php?t=39302
    Vielleicht solltest du lieber dein Design etwas ändern.



  • einheit.h

    class einheit
    {
      private:
      int lebenspunkte;
      String Name;
      public:
      einheit() {}; // Konstruktor
      ~einheit() {};
      void set_lebenspunkte (int lbp)
      {
         lebenspunkte=lbp;
      }
      void set_Name(String nm)
      {
         Name=nm;
      }
      int get_lebenspunkte()
      {
         return lebenspunkte;
      }
      String get_Name()
      {
         return Name;
      }
    };
    

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include "einheit.h"
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
       TButton *Button1;
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    einheit *nr3;
       __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       nr3=new einheit[10];
       for(int i=0;i<10;i++) nr3[i].set_lebenspunkte(i);
       delete nr3;
    }
    //---------------------------------------------------------------------------
    


  • Wenn schon delete dann richtig.
    delete[] nr3; 😉



  • Okay Okay .... 🙂



  • danke leute nun futzts;) 👍 😃


Anmelden zum Antworten