Konstruktor mit "enum" Parameter



  • Hallo zusammen!

    Ich habe ein "kleines" Problem mit einem Konstruktor der einen enum als Parameter hat: Objekte dynamisch erzeugen klappt wunderbar, wenn ich allerdings ein statisches Objekt erzeugen will bekomme ich einen Compilerfehler:

    class Foo {
    public
       enum E{
          A,
          B
       };
    
       Foo(E type) {...}
    }; 
    
    class Bar {
    public:
       Bar();
    private:
       Foo* foo;
    };
    
    Bar::Bar() :
       foo(new Foo(Foo::A)) // <- DAS funktioniert
    {}
    
    ...
    
    class Bar{
    public:
       Bar();
    private:
       static Foo foo(Foo::A); // <- g++ "error: Foo::A is not a type"
    };
    

    Ich steh ein wenig auf dem Schlauch, daher zwei Fragen:

    1. Warum beschwert sich der Compiler? Ist mir ehrlich gesagt nicht ganz klar.
    2. Wie kann ich das Problem loesen? Ist es ueberhaupt moeglich mit diesem ctor Objekte statisch zu erzeugen?

    Danke schonmal fuer eure Hinweise 🙂



  • du kannst statische Variablen in klassen nicht direkt initialisieren/definieren, sondern nur deklarieren. (Ausnahme sind integrale typen)

    class Foo {
    public
       enum E{
          A,
          B
       };
    
       Foo(E type) {...}
    };
    
    class Bar {
    public:
       Bar();
    private:
       Foo* foo;
    };
    
    class Bar{
    public:
       Bar();
    private:
       static Foo foo;
    }; 
    
    Foo Bar::foo(Foo::A); //definition in .cpp
    

    Die Fehlermeldung ist allerdings reichlich irreführend.



  • pumuckl schrieb:

    Die Fehlermeldung ist allerdings reichlich irreführend.

    Naja, der Compiler sieht an der Stelle (verständlicherweise) eine Funktionsdeklaration. Und in dem Kontext betrachtet ist die Fehlermeldung tatsächlich genau auf den Punkt...



  • dooooomi schrieb:

    pumuckl schrieb:

    Die Fehlermeldung ist allerdings reichlich irreführend.

    Naja, der Compiler sieht an der Stelle (verständlicherweise) eine Funktionsdeklaration. Und in dem Kontext betrachtet ist die Fehlermeldung tatsächlich genau auf den Punkt...

    Klar sieht er die - aber in dem gegebenen Kontext, dass man eine Variable haben möchte und garnicht unbedingt schnallt dass das als Funktionsdeklaration geparst wird, ist sie irreführend. Ähnlich wie bei dem Standardfehler, bei der Definition eines neuen Objektes mit default-ctor dessen Klammern anzugeben, was als Funktionsdeklaration geparst wird:

    class Foo
    {
      Foo() {}
    };
    int main()
    {
      Foo f(); //ups, wieso spuckt der Compiler für mein Objekt f ne Warnmeldug über Funktionen aus? (wenn überhaupt)
    }
    

Anmelden zum Antworten