Forward Declaration einer Member-Variable?



  • Hallo zusammen,

    wie gehe in C++ mit Klassenvariablen um, die nach ihrer Nutzung deklariert werden? Also sowas:

    template <typename T> class A {
    
    
    private:
        std::vector<std::tuple<T, enum A<T>::state>> vec;
    
    public:
    
        enum state {
            IN_PROGRESS,
            INITIALIZED
        };
    //...
    };
    

    In der Vektordeklaration ist state noch unbekannt. Wie kann ich dies lösen, ohne die private und public Reihenfolge zu ändern?

    Danke



  • Die Forward Declaration ist seit C++11 erlaubt. Die muss aber den Typ der Enum wissen, oder enum class, weil das dann impliziet int ist.

    template <typename T> class A {
    public:
      enum class state;
    private:
      std::vector<std::tuple<T, typename A<T>::state> > vec;
    
    public:
    
      enum class state {
        IN_PROGRESS,
        INITIALIZED
      };
      //...
    };
    


  • @freakC sagte in Forward Declaration einer Member-Variable?:

    ohne die private und public Reihenfolge zu ändern?

    Ist zwar für Dich offenbar keine Option, aber bei mir kommen öffentliche Typdefinitionen immer zuerst. Alleine Schon der Übersichtlichkeit und Dokumentation für den Benutzer wegen.



  • Das ist mit dem Standard-enum nicht möglich, da der Compiler die Größe des Datentyps benötigt (und bei einem enum ist das von den enthaltenen Werten abhängig).
    Bei Verwendung von enum class ist dies jedoch möglich, da man dort den Datentyp explizit angeben kann (s. enum "scoped enumerations)):

    template <typename T> class A {
    
    private:
        enum class state : int; // forwarding
        std::vector<std::tuple<T, A<T>::state>> vec; // A<T>:: sollte hier überflüssig sein
    
    public:
    
        enum class state : int // explizit Datentyp angegeben ('int' ist aber Standard, kann also hier auch ganz entfernt werden)
        { 
            IN_PROGRESS,
            INITIALIZED
        };
    //...
    };
    

    Bei Zugriff auf die Member des enum class mußt du jedoch immer explizit den Namen voranstellen, d.h. z.B. state::IN_PROGRESS oder alternativ using enum state; vorher verwenden.

    Ich würde aber auch einfach die Reihenfolge ändern.


Log in to reply