was ist an klassendefinition falsch?



  • Hallo nochmal,

    ich habe nun meine Klasse ergänzt um:

    //define a list to store all expressions
        static ASTExpression expressionList[DSM_EXPRESSION_CNT_MAX];
    
        //this index points to the next free element in the storage
        static size_t expressionlistIndex = 0;
    

    sowie

    /**
     * Overload the new operator to simulate dynamic memory allocation.
     */
    static void* ASTExpression::operator new (size_t size){
    
        if(expressionlistIndex + size > DSM_EXPRESSION_CNT_MAX){
            throw bad_alloc();
        }//End if
        else {
            expressionListIndex += size;
            return expressionList + expressionListIndex - size;
    
       }//End else
    }//End operator new
    

    Allerdings bekomme ich als Fehler:

    In file included from source/tinyDSMMain.cpp:12:
    source/ast/astexpression.h:118: Fehler: ISO-C++ verbietet Initialisierung des nicht konstanten statischen Elements »expressionlistIndex« in der Klasse
    

    Aber den Index auf den Speicher muß ich doch global initialisieren, da er ja für alle Objekte gilt. Wo ist mein Denkfehler????

    Danke nochmal.
    Uwe



  • Die Initialisierung der statischen Elemente muss außerhalb der Klasse (in der cpp) erfolgen. Genau das sagt der Compiler ja auch.



  • static size_t expressionlistIndex
    

    Probier' es mit

    size_t ASTExpression::expressionlistIndex = 0;
    

    in der Cpp-Datei.



  • Hi,

    ah, so gehts! Fein. Jetzt habe ich nur noch nen letztes Problem. Ich bekomme in der Zeile:

    return expressionList + expressionListIndex - size;
    

    folgenden Fehler:

    /source/ast/astexpression.cpp:179: undefined reference to `AST::ASTExpression::expressionList'

    Was mach ich den falsch (expressionlist habe ich nochmal umbenannt nach expressionList)? Noch nen Tipp??
    Uwe



  • ASTExpression::expressionList ist ja ebenfalls static. Du hast es bisher nur deklariert (in der Klassendeklaration). Du brauchst auch hier noch eine Definition in der cpp.



  • Hi zum letzten ;),

    nun habe ich in der .h:

    //define a list to store all expressions
        static ASTExpression expressionList[DSM_EXPRESSION_CNT_MAX];
    
        //this index points to the next free element in the storage
        static size_t expressionListIndex;
    

    und in der .cpp:

    //init the static counter for the simulated dynamic storage allocation
    size_t ASTExpression::expressionListIndex = 0;
    ASTExpression ASTExpression::expressionList[DSM_EXPRESSION_CNT_MAX];
    

    Ist das nicht doppeltgemommelt bzgl. der expressionList???

    Uwe



  • Nein, wieso denn?
    Das Erste ist doch nur eine Deklaration in der Klasse. Da die Variable static ist, gehört sie ja nicht zur Klasse und es wird somit auch kein Speicher dafür mit vereinbart. Das machst du durch die Definition in der cpp selbst.
    siehe auch
    http://tutorial.schornboeck.net/staticmember.htm



  • Hallo,

    ok ok. Habe ich glaube ich verstanden. Dann sage ich mal *close*. Hehe. Vielen Dank für Eure Hilfe.

    Uwe


Anmelden zum Antworten