Konstanten in Klassen?



  • Ja, also in meiner Klassendefininition taucht das hier auf:

    class CPlatte
    {
    //....
    private:
      const int  m_AnzVertizes = 44;
      const int  m_AnzIndizes = 114;
    
    };
    

    Der Compielr gibt mir dabei diese Fehler aus:
    c:\platte.h(35) : error C2258: Ungueltige Syntax fuer rein virtuelle Methode; '= 0' erforderlich
    c:\platte.h(35) : error C2252: 'm_AnzVertizes' : Nur Funktionen koennen rein virtuell deklariert werden
    c:\platte.h(36) : error C2258: Ungueltige Syntax fuer rein virtuelle Methode; '= 0' erforderlich
    c:\platte.h(36) : error C2252: 'm_AnzIndizes' : Nur Funktionen koennen rein virtuell deklariert werden

    Woran liegt das?
    Ich würde die Konstanten gerne in der Klasse defineiren, weil sie ja nur dort gebraucht werden.

    Gruß, Maxi



  • Du kannst die Konstanten nur mit dem Konstruktor initialisieren!

    class CPlatte
    {
    //....
    //Im Konstruktor musst du die Konstanten Initialisieren!
    // á la
        CPlatte():m_AnzVertizes(44),m_AnzIndizes(114);
    private:
      const int  m_AnzVertizes;
      const int  m_AnzIndizes;
    
    };
    

    Viel Erfolg noch weiterhin!

    C U

    Evil2002 aka eViLiSSiMo



  • Jetzt hab ich doch einen Fehler gemacht und hab vergessen mich vorher einzuloggen! (tztztztztztztz)

    So ist es richtig

    class CPlatte
    {
    //....
    //Im Konstruktor musst du die Konstanten Initialisieren!
    // á la
        CPlatte():m_AnzVertizes(44),m_AnzIndizes(114){}
    private:
      const int  m_AnzVertizes;
      const int  m_AnzIndizes;
    
    };
    

    C U
    Evil2002 aka eViLiSSiMo

    [ Dieser Beitrag wurde am 17.06.2003 um 10:57 Uhr von evil2002 editiert. ]



  • Viel Erfolg noch weiterhin!

    Danke, aber es geht noch nicht...
    Ich mache s jetzt so:

    class CPlatte
    {
    //....
    private:
      const int  m_AnzVertizes;
      const int  m_AnzIndizes;
    
    };
    
    CPlatte::CPlatte()
    {
    m_AnzVertizes=44;
    m_AnzIndizes= 114;
    }
    

    ABer dann gibt er mir diesen Fehler aus:
    C:Platte.cpp(12) : error C2758: 'm_AnzVertizes' : muss in der Basisklassen/Element-Initialisierungsliste des Konstruktors initialisiert werden
    c:\platte.h(35) : Siehe Deklaration von 'm_AnzVertizes'
    C:\Platte.cpp(12) : error C2758: 'm_AnzIndizes' : muss in der Basisklassen/Element-Initialisierungsliste des Konstruktors initialisiert werden
    c:\platte.h(36) : Siehe Deklaration von 'm_AnzIndizes'

    Ich habe die Konstanten doch im Konstruktor initialisiert. Wieso geht das dann trotzdem nciht?



  • Suchspiel wo ist der Unterschied.

    //evil2002
    CPlatte():m_AnzVertizes(44),m_AnzIndizes(114){}
    
    //Maxi
    CPlatte::CPlatte()
    {
    m_AnzVertizes=44;
    m_AnzIndizes= 114;
    }
    


  • Du initialisierst nicht, Du weist zu.

    Zum Problem: Schreib ein 'static' vor die Variablenvereinbarung oder nimm ein 'enum'.



  • so, jetzt hab ch es so wie evil gemacht.

    ABer wenn ich dann das hier machen will:

    short int Indizes[m_AnzIndizes] = {//...};
    

    dann gibt er mir aus, das ein konstanter Ausdruck erwartret wird.

    Wieso?



  • Beim Deklarieren eines Arrays muss die Größe zur Kompelierzeit bekannt sein.
    Wenn die Größe nicht bekannt es muss er dynamisch mit new[] und delete[]
    angelegt werden.



  • Ich weiß, aber ich habe doch die Konstanten initialisiert. Und Konstanten stehen doch schon zur Kompilierzeit fest oder niht?



  • Steht das Array denn in einer Methode der Klasse drin?



  • Wenn du vorher schon weist das diese grösse brauchst dann definere
    deine Variablen als

    const int bla = 44; usw.

    ausserhalb deiner Klasse



  • @dreaddy:
    Ja, es wird in einer Methode erzeuge und dort auch wieder gelöscht:

    CPlatte::function()
    {
    SvertexPlatte Array[21];   // anstatt 21 würde ich eben gerne die Konstante einsetzen.
    //...
    }
    

    @evil:
    Ich hab mir das auch schon überlegt, aber nach den Regeln der OOP(ich hoffe ich hab sie kapiert...) sollte doch jedes Objekt selbst wissen, was es amchen muss, und kein anderes muss es wissen, daher wollte ich die Konstante eben in der Klasse definieren.

    Gruß, mAxi



  • Hast du die Antwort von Daniel E. nicht gelesen?



  • zur erinnerung: static dazupacken. dann kannst du in der klasse auch direkt schreiben

    static const int x = 10;
    oder
    const static int x = 20;



  • Original erstellt von Maxi:
    Und Konstanten stehen doch schon zur Kompilierzeit fest oder niht?

    tun sie das?

    #include <iostream>
    
    int main()
    {
      int temp;
      std::cin>>temp;
      int const konstante=temp;
    }
    

Anmelden zum Antworten