globaler zeiger



  • 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?



  • okey, war wohl eine blöde frage.
    kann iostream einfach mit <iostream> einbinden und cout mit std::cout benutzen.
    ist denn std eine singleton-klasse?



  • d00j1 schrieb:

    ist denn std eine singleton-klasse?

    Nein, sondern ein Namensraum. Namensräume werden auch mittels Scope-Operator :: spezifiziert.


Anmelden zum Antworten