Klassenbezogene Konstanten definieren?



  • Folgendes Problem: Ich würde ein Define/eine Konstante gerne bezogen auf eine Klasse bzw. ein Objekt definieren, so dass diese nur im Zusammenhang mit diesem Objekt bekannt ist.

    Also z.B. so:

    MyClass mC;
    mC.setMode(mC.MODE_A);
    

    Es soll also MODE_A nur über MyClass oder wie oben über mC zugreifbar sein, womit ein simples #define also wegfällt. Mit einem

    const int MODE_A=1;
    

    im public-Teil des Headers funktioniert es schon mal nicht.

    In Java geht sowas beispielsweise mit

    static final int MODE_A=1;
    

    Wie geht sowas in C++?

    Elmi



  • struct die_klasse
    {
      static const int SIEBEN = 111;
    };
    
    /* ... */
    
    int main()
    {
      ::std::cout << die_klasse::SIEBEN;
    }
    

    so, oder so ähnlich ging das...



  • Warum ist in dem Java-Beispiel die Konstante static und im C++-Code nicht?



  • So funktioniert es eben leider nicht.

    Packe ich es in das Headerfile ausserhalb von "class":

    error C2258: Ungueltige Syntax fuer rein virtuelle Methode; '= 0' erforderlich
    error C2252: 'SIEBEN' : Nur Funktionen koennen rein virtuell deklariert werden
    'die_klasse' : 'struct'-Typ-Neudefinition
    

    Packe ich es in das C-File oder im Headerfile in den class-Bereich:

    error C2580: Neudefinition des Klassennamens 'die_klasse'
    Siehe Deklaration von 'die_klasse'
    error C2649: 'die_klasse' ist kein 'struct
    


  • @frosty: Das Beispiel ist rein willkürlich, mit dem static hat es genau so wenig geklappt - die Compilerfehlermeldungen sind die gleichen.





  • Hallo,

    so müsste es funktionieren:

    //bla.h
    class bla
    {
    	static const int i;
    };
    
    ...
    
    //bla.cpp
    const bla::i = 1234;
    


  • *sich am Hinterkopf kratzt*

    würde mal sagen die Variable in header deklarieren

    static const int iValue;
    

    und in der CPP-Datei dann definieren:

    int Class::iValue = 2;
    

    Wobei ich mir nicht mehr sicher bin, ob man im cpp das const nochmal hinschreiben muss aber das kannst du ja ausprobieren...

    Ansonsten verwendest du bestimmt VC++ 6 Elmi, oder?

    Der Compiler mag die Definition im Header nicht, obwohl dies eigentlich gültiger C++ Code ist.



  • maxpower1984 schrieb:

    Hallo,

    const bla::i = 1234;
    

    Thx, das war der entscheidende Hinweis!



  • maxpower1984 schrieb:

    //bla.h
    class bla
    {
    	static const int i;
    };
    
    //bla.cpp
    const bla::i = 1234;
    

    Das hat den Nachteil, dass bla::i dann keine Compilezeit-Konstante ist und z.B. nicht als case-Label oder Arraydimension verwendet werden kann. Wenn man das will, dann geht -- allerdings nur mit integralen Typen (char, int, enum ...) -- nur die direkte Definition in der Klasse:

    class Bla {
      static const int i = 1234;
    };
    

    Bei Compilern, die das nicht schlucken (z.B. meines Wissens MSVC 6), funktioniert folgender Workaround ("enum-Hack"):

    class Bla {
      enum {
        i = 1234; 
      };
    };
    


  • Andere Methode

    Header:

    class MyClass
    {
    // Einiges
    
        static int   Constant_0 (void);
        static float Constant_1 (void);
    
    //Rest
    }
    

    Body:

    int MyClass::Constant_0 (void)
    {
        return 4711;
    }
    
    float MyClass::Constant_1 (void)
    {
        return 4711.4711;
    }
    

Anmelden zum Antworten