Problem mit const in Klasse



  • Hi,
    gegeben ist folgende Klasse

    enum BEERRORTYPE
    {
        BERT_FAILED,
    };
    
    class beError
    {
        public:
            //Type Definitions
    
            //Tors
            beError(void);
            ~beError(void);
            beError(const beError& rerError);
    
            //Methodes
    
            //Get Methodes
            inline BEERRORTYPE gError(void);
    
        private:
            //Attributes
            BEERRORTYPE ertError;
    
    };
    
    beError::beError(void)
    {
        this->ertError=BERT_FAILED;
    }
    
    beError::~beError(void)
    {
    
    }
    
    beError::beError(const beError& rerError)
    {
        this->ertError=rerError.gError(); //hier kommt der Fehler
    }
    
    BEERRORTYPE beError::gError(void)
    {
        return this->ertError;
    }
    

    Wenn ich versuche das zu compilieren bekomme ich folgenden Fehler
    ....discard qualifiers...

    Wenn ich das const im Copy Konstructor wegnehme funktioniert es tadellos.
    Nur habe ich keine Ahnung warum.
    Auch wenn ich statt rerError.gError() rerError.ertError einsetzte funktioniert es.

    gError ist doch nur eine einfache Methode.



  • Die gError Methode muß const sein.


  • Mod

    Wlusi schrieb:

    Wenn ich versuche das zu compilieren bekomme ich folgenden Fehler
    ....discard qualifiers...

    Bitte immer die komplette Fehlermeldung posten, insbesondere auch die Stelle, an der sie auftritt. Eine nicht-statische Memberfunktion, die nicht const ist, kann nur mit Objekten aufgerufen werden, die nicht const sind. Der Parameter des copy-ctors ist hier aber vom Typ const beError& . Um mit diesem Objekt die Funktion gError() aufrufen zu können, müsste der Typ aber beError& sein, d.h. das const des Parameters unter den Tisch fallen (was der Compiler ja auf sagt: "call to ... discards qualifiers" oder so ähnlich), was aber nicht möglich ist. Es gibt keine implizite Konvertierung eines const T in ein T.



  • Dann habe ich noch eine Frage.

    Wenn ich bei dem Copy Constructor das const wegnehme, gilt er dann immer noch als Copy Constructor oder als einfacer Constructor?

    Zweite Frage. Wie mache ich die Methode const?
    Folgendes funktioniert nicht:

    class beError
    {
        public:
            //Type Definitions
    
            //Tors
            beError(void);
            ~beError(void);
            beError(const beError& rerError);
    
            //Methodes
    
            //Get Methodes
            inline const BEERRORTYPE gError(void);
    
        private:
            //Attributes
            BEERRORTYPE ertError;
    
    };
    
    const BEERRORTYPE beError::gError(void)
    {
        return this->ertError;
    }
    

    mfg



  • Hmm, irgendwie finde ich die ganzen Präfizes ganz schön verwirrend. Bist Du Dir sicher, dass Du die brauchst?



  • Hmm, irgendwie finde ich die ganzen Präfizes ganz schön verwirrend. Bist Du Dir sicher, dass Du die brauchst?

    Sicher bin ich mir nicht nicht, aber mir helfen sie bei größeren Projecten imens.
    Aber nun zurück zum Topic...



  • Wlusi schrieb:

    Zweite Frage. Wie mache ich die Methode const?

    Indem du das const hinter die Methodendeklaration und -implementation schreibst:

    class bar
    {
       int foo() const;
    };
    
    int bar::foo() const
    {
       return 42;
    }
    

Anmelden zum Antworten