Const initialisieren



  • Soweit so gut, aber warum braucht jedes Objekt seine eigene Naturkonstante? -> static



  • nwp3 schrieb:

    Soweit so gut, aber warum braucht jedes Objekt seine eigene Naturkonstante? -> static

    Ja, das stimmt schon.

    Darüber hatte ich bisher auch noch nicht nachgedacht, weil ich i.d.R. 'ein' Objekt initialisiere, dass dann inhaltlich für die zu berechnende Physik verantwortlich ist. Ich initialisiere also gar nicht mehrere Objekte der gleichen Klasse.

    Gruß,
    -- Klaus.



  • krümelkacker schrieb:

    Mal am Rande gefragt: Warum willst du ein const-Element? Ich kann mich nicht daran erinnern, das jemals gemacht zu haben.

    Ich habe so etwas z.B. gebraucht für Objekte, welche eine feste ID oder Namen haben, welche nicht mehr geändert werden darf.



  • Deswegen musst du die Membervariable nicht konstant machen, sondern kannst einfach keinen Schreibzugriff anbieten.

    Das Problem ist, dass const -Member das Objekt sehr stark einschränken und du Wertsemantik verlierst. Du kannst keine Zuweisungen mehr machen, die Objekte nicht in Containern speichern, ...



  • Klaus82 schrieb:

    Darüber hatte ich bisher auch noch nicht nachgedacht, weil ich i.d.R. 'ein' Objekt initialisiere, dass dann inhaltlich für die zu berechnende Physik verantwortlich ist. Ich initialisiere also gar nicht mehrere Objekte der gleichen Klasse.

    Physik berechne ich idR mit Funktionen (zumindest im Interface) und verstecke die Konstanten in einem anonymen Namespace im Source-File. Aufgabentrennung ist ein wichtiges Prinzip und ich trenne gerne die Implementierung der Formeln von dem Speichern der Objekte.



  • Nexus schrieb:

    Deswegen musst du die Membervariable nicht konstant machen, sondern kannst einfach keinen Schreibzugriff anbieten.

    Innerhalb der Klasse kann man auch ohne "Schreibzugriff anbieten" schreiben. Man schützt sich durch das const dagegen sich selbst in den Fuss zu schiessen.
    Und es dokumentiert auch gleichzeitig dass sie an den Variablen nie was ändert.

    Nexus schrieb:

    Das Problem ist, dass const -Member das Objekt sehr stark einschränken und du Wertsemantik verlierst. Du kannst keine Zuweisungen mehr machen, die Objekte nicht in Containern speichern, ...

    Wertsemantik "verliert" man nur, wenn das Objekt überhaupt Wertsemantik haben könnte.
    Und man verliert move.
    Kann man aber oft verschmerzen.

    Und in gewissen Fällen verliert man genau gar nix, nämlich wenn die Objekte typischerweise so verwendet werden dass man Zeiger auf sie hat. Dann kann man nämlich eh nimmer moven, weil die Stellen die die Zeiger haben das ja nicht mitbekommen.



  • staticonst schrieb:

    Physik berechne ich idR mit Funktionen (zumindest im Interface) und verstecke die Konstanten in einem anonymen Namespace im Source-File. Aufgabentrennung ist ein wichtiges Prinzip und ich trenne gerne die Implementierung der Formeln von dem Speichern der Objekte.

    Aha. Und wie geht das? 😕

    Gruß,
    -- Klaus.



  • Beispiel:

    // Header:
    double sqrdist(point p1, point p2);
    double distance(point p1, point p2); // slow
    double force(double m1, point p1, double m2, point p2);
    
    // Source:
    
    // Anonymer Namespace: Diese Konstanten/Funktionen sind nur in diesem File sichtbar
    namespace {
      const double G = 6.67384e-11;
    
      // Hilfsfunktionen kommen auch rein
      // (gut, diese könnte man auch als Template öffentlich
      //  machen, aber soll ja nur ein Beispiel sein)
      double square(double x) { return x*x; }
    }
    
    double sqrdist(point p1, point p2)
    { return square(p1.x-p2.x) + square(p1.y-p2.y); }
    double distance(point p1, point p2)
    { return sqrt(sqrdist(p1, p2));
    double force(double m1, point p1, double m2, point p2)
    { return G*m1*m2/sqrdist(p1, p2); }
    


  • nwp3 schrieb:

    Soweit so gut, aber warum braucht jedes Objekt seine eigene Naturkonstante? -> static

    Weil das umschliessende Universum eines Objekts verschieden sein kann. 🙂


  • Mod

    Die Feinstrukturkonstante Alpha hat sich über die Jahrtausende verändert. Damit muss jedes Objekt seine eigene (auf seine Zeit und seinen Raum zutreffende) Feinstrukturkonstante speichern, oder nicht?



  • Und wenn es sich um ein Spiel/Simulation handelt, dann kann es auch ganz interessant sein, wenn Physik fuer manche Objekte unterschiedlich ist.


Anmelden zum Antworten