globaler zeiger



  • hallo,
    grundsätzlich habe ich ein verständnis für die sprache c++.
    was ich aber leider nicht hin bekomme ist:
    ich möchte ein globales objekt erzeugen (im prinzip eine liste oder array mit ein paar funktionen).
    das möchte ich gern so initialisieren, dass ich aus anderen funktionen und klassen heraus darauf zu greifen kann und dinge hineinschreiben bzw. herauslesen kann.
    so inetwa:
    ..
    ..
    class feld {
    ..
    private: int k;
    public: void set (int p) {k = p;}
    };
    feld k;
    class edit {
    ...
    ...
    public: edit ()
    {
    k.set(1);
    }
    };
    main() {}..



  • 1. benutze für code bitte die entsprechenden tags, da mann den code sonst kaum lesen kann.
    2. zeugt dein Wunsch von schlechtem Design, was hält dich denn davon ab, das zu bearbeitenden Feld als parameter zu geben (per reference oder pointer).
    3. warum ist die Edit methode kein member von deinem Feld, das wär das logischst (zumindest wenn ich das bisschen code so sehe)



  • mach ein header file mit

    #ifndef GLOBAL_VARS_H
    #define GLOBAL_VARS_H
    extern feld * k;
    #endif
    

    und in einem der source code files definierst du dann das feld.

    feld * k = NULL;
    

    So müsste das klappen.

    LG
    Neph

    PS: vlad_tepesch hat recht. In den allermeisten Fällen brauchst du keine globale Variable.



  • danke für eure Antworten.

    Ich möchte eine zentrale Verwaltung für Events (im Sinne von Simulationsevents) programmieren. Dazu ist es erforderlich, dass verschiedene Entity_Klassen (Generator und Maschine) in die Event-Verwaltung schreiben können.
    Darum versuche ich das so zu lösen. Es ist mir klar, dass ich die Informationen per Zeiger, oder Wert übergeben könnte, das fände ich jedoch sehr unhandlich und wenig flexibel bei der Modellierung.
    Versteht ihr mein Problem?



  • Wenn diese Verwaltung zentral ist, dann benutze eine Singelton Klasse, die in einer statischen Funktion eine Referenz auf die einzige instanz zurückgibt:
    Das ist quasi global, aber schöner 😉

    Und das Event in die Verwaltung schreiben, würde ich als member von Der Verwaltung machen

    class EventHandler
    {
    public:
      static EventHandler& getInstance()
      {
        static EventHandler instance;
        return instance;
      }
    
      bool addEvent( const Event& i_event);
    
    private:
      EventHandler(); // privater contructor.
    }
    


  • aber wo ist mein speicher-objekt (array, liste)?
    verstehe ich nicht ganz? 😞



  • d00j1 schrieb:

    aber wo ist mein speicher-objekt (array, liste)?

    Das müsstest du eben noch in die Klasse einbauen. Was vlad_tepesch gezeigt hat, war eher ein Grundgerüst, um Singletons zu verdeutlichen.



  • okey - verstehe ist eine schöne Sache :).
    Folgendes habe ich versucht:

    class Sim_Queue {
          private:
                  static Sim_Queue *instance;
                  Sim_Queue();
                  int db;
          public:
                 static Sim_Queue *getInstance()
                 {
                        if (instance == NULL)
                        {
                           instance = new Sim_Queue();
                        }
                        return instance;
                 }
                 void set (int p)
                 {
                        db = p;
                 }
    };
    
    int main ()
    {
    
     Sim_Queue* s = Sim_Queue.getInstance();
    
      return 0;
    }
    

    Leider gibt

    Sim_Queue* s = Sim_Queue.getInstance();
    

    einen Fehler?
    Und wenn es gehen würde. Könnte ich dann mit s.set(blub) db ändern?

    vielen lieben Danke 🙂



  • du statische member qualifiziert man über die klasse und den scopoperator:

    int main ()
    {
    
     Sim_Queue* s = Sim_Queue::getInstance();
    
      return 0;
    }
    

    cih würds dennoch mit der statischen lokalen variable machen, hat den vorteil, dass die abfrage entfällt.

    Und ich würde statt einen pointer eine referenz zurückgeben, dass ist eher c++ stylish



  • habs hinbekommen schön 🙂
    wieso sind referenzen denn besser?



  • d00j1 schrieb:

    habs hinbekommen schön 🙂
    wieso sind referenzen denn besser?

    1. Garantieren Referenzen das ein Objekt vorhanden ist (NULL ist unzulässig)
    2. Ist die Referenzsyntax meist angenehmer zu lesen

    cu André



  • Referenzen sind nicht grundsätzlich immer besser, sondern eben bequemer und sicherer. Es gibt Fälle, da kommt man um Zeiger nicht herum, aber wenn möglich (z.B. Parameterübergabe), sollte man auf Referenzen zurückgreifen.



  • warum geht das:

    class runTime
          {
                 private:
                        static int rTime;
                        runTime();
                 public:
                 static int outTime()
                 {
                        return rTime;
                 }
          };
    int runTime::rTime=0;
    

    nicht? 😞



  • Das frage ich mich auch (es sollte funktionieren).



  • was heisst geht nicht?



  • naja Dev-C++ sagt:

    multiple definition of `runTime::rTime'

    ?



  • mach die definition ( int runTime::rTime=0; ) in eine cpp datei.
    theta



  • d00j1 schrieb:

    Dev-C++

    Ich würde dir raten, davon wegzukommen. Bloodshed Dev-C++ wird nicht mehr weiterentwickelt und hat auch einige Probleme. Gute Alternativen wären Microsoft Visual C++ 2008 Express Edition oder Code::Blocks.



  • kann man denn mit visual c++ ganz normal c++ entwickeln? ich meine ich hätte das mal getestet und er kannte zB cout<< nicht?

    theta@ ich habe es nun über die main funktion geschrieben und jetzt scheint es zu gehen, wieso auch immer?



  • d00j1 schrieb:

    kann man denn mit visual c++ ganz normal c++ entwickeln?

    😃

    Natürlich kann man das. Wenn man selber Fehler macht, sodass cout nicht gefunden wird, kann man nicht die IDE beschuldigen. Glaub mir, mit MSVC++ kann man um einiges besser und effizienter programmieren als mit Dev-C++.

    d00j1 schrieb:

    theta@ ich habe es nun über die main funktion geschrieben und jetzt scheint es zu gehen, wieso auch immer?

    Wenn der Header mehrere Male eingebunden wird, hast du ein mehrfach definiertes Symbol, mit dem der Linker dann Probleme bekommt. Deshalb Deklarationen in die Header, Definitionen in Implementationsdateien.



  • wie lässt sich dies den einfach und konfortabel realisieren?
    gibt es da irgendwelche standarteinstellungen?


Anmelden zum Antworten