Variablen über mehrere Funktionen verfügbar machen ?



  • hi,

    ich muss auf eine Variable in mehreren Funktionen zugreifen.
    Nun heißt es ja immerwieder "Finger weg von globalen Variablen" warum auch immer, aber wie geht es denn sonst ?





  • Vielleicht solltest du mal etwas ausholen, weshalb du die Variable in mehreren Funktionen verfügbar machen - und diese nicht jeweils den Funktionen übergeben kannst?

    -junix



  • nun gut ich hab mir das jetzt mal durchgelesen, bin aber nicht wirklich schlauer daraus geworden. ihr wollt damit sagen lieber oop nutzen ...

    aber angenohmen ich schreib dafür jetzt ne klasse, dann kennt funktion 1 zwar das objekt aber funktion 2 kennt es dann wiederum doch auchnicht:

    beispiel

    xxx function1(...)
    {
    
      Klasse Objekt;
      Objekt->setData(...); // Daten in Objekt speichern auf die später z.b. funktion2 zugreifen soll ...
    }
    
    xxx function2(...)
    {
      /* und nun ? erzeug ich ein neues Objekt ist es leer.
         Auf das alte Objekt kann ich allerdings nur zugreifen wenn ich es public mache, aber wie komme ich jetzt an die in setData() gespeicherten Werte wieder dran ????? */
    
    }
    

    }

    ich hoffe du verstehst meine problematik!

    danke



  • ich meine damit z.b. wenn ich eine variable x habe und diese nicht global ist kenne ich sie eben nur in der dazugehörigen funktion. wenn ich aber nun meine variablen in z.b. ein edit feld lege dann kann ich diese über edit1->text wieder auslesen. es ja aber nicht angehen das ich für jede variable auf die später zugreifen muss ein textfeld oder sonstiges anlegen muss, daher meine frage wie ich das eben richtig machen muss. wie gesagt sehe ich da mit klassen momentan keinen ausweg da das objekt ja auchnur der jeweiligen funktion bekannt ist, oder ?



  • Da dies ja offensichtlich Klassemethoden sind, kannst du doch einfach ein Attribut in der KLasse erstellen, die diesen Wert enthält?

    -junix



  • ja du meinst damit

    z.b.

    classe xyz
     public:
      setX(int x);
      getX(int x);
    
     private:
       int ax; // und das wäre das Attribut
    

    nun gut also angenohmen unter button1Click wird nun das objekt erzeugt:

    xyz Objekt;
     Objekt->setx(13);
    

    nungut also steht nun in dem attribut ax der wert 13.
    ok, und jetzt wird button2 angeklickt der diesen wert also Objekt->ax braucht.
    Da aber die Funktion2 das Objekt "Objekt" garnicht kennt kann es doch schließlich auchnicht darauf zugreifen und da bin ich wieder bei meinem alten problem! wie greife ich auf solche werte übere mehrere funktionen hinweg zu ????



  • und wo ist das Problem?

    du muss dein
    xyz Objekt;
    in z.B. private Abschnitt deiner Form Klasse reinschreiben, damit ist es in allen Klassenmethoden sichtbar. das hat auch junix gemeint.



  • oh gott damn!
    kann das sein ?

    also ich muss einfach in unit.h im privat bereich xyz Objekt machen und kann drauf zugreifen ?

    werde das jetzt mal testen und wenn das wirklich geht bin ich euch was schuldig, da wäre ja der hammer !!!!



  • noch eins,

    und wenn ich nun direkt aus der klasse auf ListBox1 zugreifen will
    muss ich woll eine methode schreiben in der ein zeiger auf listbox1 in die klasse übergeben wird ?

    sprich:

    class xyz 
    {
     ...
     setText(TListBox *lstbx, AnsiString *text)
     {
       lstbx->items->add(text);
     }
    
     ...
    


  • du hast es erfasst



  • und lass mich raten wenn ich nun von einem anderen formular ebenfalls auf die selbe klasse zugreifen will schreibe ich die zuweisung klasse objekt; einfach in public und könnte dann von unit2 z.b. form1->objekt->setX(3) machen, gell ?



  • halt,

    funtzt aber dochnicht ganzso wie gesagt,

    hab also meine klasse.h includet und in unit1.h im privat bereich:

    einfach klassenname objekt; geschrieben

    und erhalte folgenden fehler:

    [C++ Fehler] Unit1.h(23): E2303 Typname erwartet



  • wenn du #include "klasse.h" in die unit.h reinschreibst, muss gehen.



  • aha also in die unit.h includen und nicht in die unit.cpp!
    werd ich mal probieren ...



  • ok, funtzt.
    und ich muss die Headerdatei in die unit.h includen da ich dort das objekt erzeuge oder warum ???



  • wie wärs mit einwenig C/C++ Grundlagen?



  • func schrieb:

    und lass mich raten wenn ich nun von einem anderen formular ebenfalls auf die selbe klasse zugreifen will schreibe ich die zuweisung klasse objekt; einfach in public und könnte dann von unit2 z.b. form1->objekt->setX(3) machen, gell ?

    Nun lies dir nochmals den Post von "AndreasW" am 24 Nov 2003 um 11:31

    -junix



  • hab ich,
    ich bekomme sobald ich nun das ganze compilieren will immer folgenden fehler:

    [Linker Fehler] Unresolved external 'TForm1::setZahl(int)' referenced from E:\CPP3\PUBLIC FUNKTIONEN\MAIN.OBJ

    so ist mein source:

    Main.h

    //---------------------------------------------------------------------------
    
    #ifndef MainH
    #define MainH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include "function1.h"
    
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
            int setZahl(int zahl);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    function1.h

    int setZahl(int zahl);
    

    function1.cpp

    int setZahl(int zahl1)
    {
      static int back = 0;
      back = back + zahl1;
    
      return back;
    }
    

    und das ist immer der fehler 😞
    [Linker Fehler] Unresolved external 'TForm1::setZahl(int)' referenced from E:\CPP3\PUBLIC FUNKTIONEN\MAIN.OBJ



  • "setZahl" müsste hald schon ne Klassenmethode und nicht einfach ne normale C-Style Funktion sein...

    -junix



  • kann ich "einfache" funktionen nicht global zugänglich machen ???
    muss ich dann wirklich in jede unit die funktion reinschreiben, das kann doch nicht sein, oder ?


Anmelden zum Antworten