Class variabel Global definieren



  • Hallo,

    wenn ich eine Class Variable local definiere funktionert alls OK.

    wenn ich globl definire bekomme ich folgende Fehlermeldung:

    "Datensatz mehrfach definiert."

    was Ich mache ist:

    int x=500;
    DS *Datensatz;
    Datensatz=new DS[x];

    Ds ist meine Class.

    Was ich brauch ist, meine Class soll für 500 Datensatz für alle unterprograme zur verfügung stehen.

    Kann jemand sagen, was ich machen muss damit meine Class glabel zur verfügung steht?

    Gruß
    S.Mathi 😡



  • Hallo

    ich denke du willst so etwas
    Headerdatei

    extern int x=500;
    extern DS *Datensatz;
    

    Implementationsdatei

    int x=500;
    DS *Datensatz=new DS[x];
    

    damit kannst du den Header mehrmals includen
    allerdings solltest du
    1. globale Variablen vermeiden, insbesondere welche die du mit new erstellst, denn die werden selten wieder mit delete gelöscht
    2. statt dem C-Array lieber std::vector oder std::array nehmen, was dir die Speicherverwaltung abnimmt.

    bis bald
    akari



  • extern int x=500;
    extern DS *Datensatz;

    extern benutzt man doch eine Variable von z.B wenn man eine Variable von Form eins in Form2 benutzen will.

    Ich will nur innerhalb Form1 bleiben aber unter verschiedenen Ereignisse.

    Unter Button2klick, Botten3klick usw.

    Gruß
    S.Mathi



  • extern int x=500;
    extern DS *Datensatz;

    extern benutzt man doch eine Variable von z.B wenn man eine Variable von Form eins in Form2 benutzen will.

    Ich will nur innerhalb Form1 bleiben aber unter verschiedenen Ereignisse.

    Unter Button2klick, Botten3klick usw.

    Gruß
    S.Mathi



  • [cpp]
    struct Zahl
    {
    int x;
    int m;
    } ;

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    std::vector<Zahl>TestZ;
    int x=5;
    Zahl Z[5];
    Z[1].x=20;
    Z[2].x=10;

    TestZ.push_back();

    Edit1->Text=IntToStr(Z[1].x);

    Edit2->Text=IntToStr(Z[2].x);

    } // bis hier alles OK

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {

    Edit1->Text=IntToStr(Z[1].x);

    Edit2->Text=IntToStr(Z[2].x);
    }

    was muss ich machen, damit im Bereich "Button2Click" gespeichere Daten dauerhaft bleibet und "Button3Click" zur verfügung steht?

    Gruß
    S.Mathi



  • So als Beispiel:

    class Zahl
    {
    private:
       int x;
       int m;
    public:
       Zahl(int ix,int im){x=ix;m=im;}
       int get_x(){return x;}
       int get_m(){return m;}
    };
    
    vector <Zahl> Z;
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       Z.erase(Z.begin(),Z.end());
       Z.push_back(Zahl(10,123));
       Z.push_back(Zahl(20,456));
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       try
       {
          Edit1->Text = IntToStr(Z[0].get_x());
          Edit2->Text = IntToStr(Z[1].get_x());
       }
       catch (...)
       {
          Application->MessageBoxA("Erst Button 1 drücken","Fehler");
       }
    }
    


  • Prinzipiell richtig. Ich würde aber "vector <Zahl> Z;" zu einem private Member von TForm1 machen. Da ist diese Variable dann allen Memberfunktionen von TForm1 bekannt.



  • Jau.
    Ist halt nur ein Beispiel basierend auf "Globals" gewesen. Die Klasse Zahl gehört auch in eine eigene Header und dann included.



  • Vielen Dank an Braunstein , Massa und alle Beteiligten.

    Ich habe eine Losung gebildet, eine Mischung aus der Lösung von Braunstein & Massa.

    Gruß
    S.Mathi.
    🙂 🙂 🙂 👍 👍


Anmelden zum Antworten