Initialisierungsreihenfolge von statischen Variablen



  • Hi,

    folgender Code führt zur Problemen zur Laufzeit, da num_steps = 0 gilt:

    //Servo.cpp
    const unsigned int Servo :: max_value = 90;
    const unsigned int Servo :: min_value = 0;
    const unsigned int Servo :: num_steps = (max_value - min_value) / step_size + 1;
    const double Servo :: step_size = 45;
    
    //Action.cpp
    const unsigned int Action::num_actions = 12*Servo::num_steps;
    

    Das Problem ist, dass num_actions vor num_steps initialisiert wird und dadurch num_actions = 0 gilt. Soweit ich gegoogelt habe, liegt das daran, dass im C++-Standard dafür keine Reihenfolge definiert ist.
    Leider habe ich keine wirklich praktikable Lösung gefunden. Anscheinend kann man das Problem mit statischen Funktionen lösen, jedoch haben alle Beispiele die ich gefunden habe sich immer auf Konstruktoren bezogen.
    Hat jemand eine Idee / Beispiel wie man das einfach machen kann?

    Gruß

    Pille



  • Statische integrale Konstanten... die kannst du direkt in der Klassendefinition initialisieren:

    //----------------------------------------------------------------------------
    // Servo.hpp
    
    class Servo
    {
    ...
    static const unsigned int max_value = 90;
    static const unsigned int min_value = 0;
    static const unsigned int num_steps = (max_value - min_value) / step_size + 1;
    static const double step_size; // nicht integral, C++03 erlaubt daher hier keine initialisierung (C++11 schon)
    };
    
    //----------------------------------------------------------------------------
    // Servo.cpp
    
    const unsigned int Servo :: max_value; // nur nötig wenn die konstante mal als lvalue verwendet wird
    const unsigned int Servo :: min_value; // --""--
    const unsigned int Servo :: num_steps; // --""--
    const double Servo :: step_size = 45; // immer nötig
    
    //----------------------------------------------------------------------------
    // Action.hpp
    
    #include "Servo.hpp"
    
    class Action
    {
    ...
    static const unsigned int num_actions = 12 * Servo::num_steps;
    ...
    };
    
    //----------------------------------------------------------------------------
    // Action.cpp
    
    const unsigned int Action::num_actions; // nur nötig wenn die konstante mal als lvalue verwendet wird
    

Anmelden zum Antworten