this zeiger umwandlungs problem *noobish*



  • der sourcecode an sich dort ist ... relativ unlogisch ... die fuellhoehe soll in ml angegeben werden ... aber dort worauf du zeigtest zeile 21 bei dir ... gitbt es keinen error der error kommt wirklich genau in zeile 75...



  • unskilled schrieb:

    ...
    bool Becher::ReichtKapazitaet(const Becher* b) const { 
        if(inhalt!=b->inhalt) //hier meckert er, weil b konstant ist aber inhalt eine variable ist ...
    

    Sorry, aber das ist bestimmt nicht richtig. Der rein lesende Zugriff auf Member von const-Objekten ist unkritisch.

    Gruß,

    Simon2.



  • /edit: zu spääät 🙄 (nanu? das gibt es doch nicht, ich hab doch nicht eine halbe stunde jetzt dafür gebraucht?)

    ein paar tipps

    Becher.h:
    #pragma once
    

    portables ist das mit include-guards.

    class Becher {
    public:
    	std::string inhalt;
    	float fuellhoehe;
    	int Fassungsvermoegen;
    

    öffentliche datenmember, das ist ganz, ganz böse!

    Becher(std::string i, int fa, float fu);
    

    lieber eine (konstante) referenz eines strings anstatt eine kopie übergeben (also Becher(std::string const& i, ... )

    bool ReichtKapazitaet(int ml);
    

    warum nicht auch const ?

    b.inhalt="Milch";
    b.fuellhoehe=50;
    b.Fassungsvermoegen=300;
    

    das ist überflüssig. du hast den Becher ja gerade mit diesen werten initialisiert.

    Becher::Becher(string i,int fa,float fu) 
    	: inhalt (i), Fassungsvermoegen (fa), fuellhoehe (fu)
    
    {
    	inhalt=i;
    	Fassungsvermoegen=fa;
    	fuellhoehe=fu;
    }
    

    ebenso überflüssig. wenn du schon eine elementinitialisierungsliste verwendest, dann musst du nicht extra noch allen variablen den wert ein zweites mal zuweisen.

    bool Becher::ReichtKapazitaet(const Becher* b) const {
    	if(inhalt!=b->inhalt)
    		return(false);
    	return(ReichtKapazitaet(
    		static_cast<int>(b->Fassungsvermoegen/100.0F*
    		b->fuellhoehe)));
    
    }
    

    und hier ist dein fehler (wenn du gewollt hast, dass ich gleich auf die fehlermeldung eingehe, hättest du zumindest die zeile, in der der compiler den fehler meldet, angeben müssen 😉 )
    Becher::ReichtKapazitaet (int ml) ist eine nicht-konstante memberfunktion, d.h. sie kann nur mit einem nicht-konstanten this-zeiger aufgerufen werden. Becher::ReichtKapazitaet (const Becher*) const ist aber eine konstante memberfunktion, hat daher einen konstanten this-zeiger.
    merke: nicht-konstante memberfunktionen können nicht aus konstanten memberfunktionen heraus aufgerufen werden.

    übrigens: return ist kein funktionsaufruf. es reicht

    return false;
    //und
    return ReichtKapazitaet (...);
    

    alles klar?



  • ok danke für alle Antworten

    Becher::ReichtKapazitaet (int ml) ist eine nicht-konstante memberfunktion, d.h. sie kann nur mit einem nicht-konstanten this-zeiger aufgerufen werden. Becher::ReichtKapazitaet (const Becher*) const ist aber eine konstante memberfunktion, hat daher einen konstanten this-zeiger.
    merke: nicht-konstante memberfunktionen können nicht aus konstanten memberfunktionen heraus aufgerufen werden.

    Tut mir leid für diese Frage aber was genau ist ein nicht-konstanter this-Zeiger ?... habe immer nur dieses "eine" this gelernt gehabt ... würdest du das bitte als Beispiel an meinem Codeabschnitt anwenden ??? oder jemand anders... ^^



  • void fkt (const Becher* b) //ein konstanter zeiger...
    {
    b->variable = 56789; //genau dein fehler, da b konstant ist
    }
    

    übrigens macht man das so (siehe Referenzen):

    void fkt (const Becher &b)
    {
    b.variable_oder_funktion_hauptsache_als_const_deklariert_oder_nur_lesender_zugriff; // ^^
    }
    

    bye



  • ... und damit man das nicht mittels Memberfunktionen aushebeln kann, kann man die auch "const machen":

    class Becher {
       void f() { variable = 56789; }
       void g() const { variable = 56789; } // -> Fehler: g() const (oder je nach Sprachgebrauch: "this" ist const), Zuweisung nicht
       void h() const { cout << variable; } // OK; operator<<() ist const
    ...
    
    void fkt (const Becher* b) //ein konstanter zeiger...
    {
       b->variable = 56789; // -> Fehler: b const, Zuweisung nicht
       b->f();              // -> Fehler: b const, f() nicht
       b->h();              // OK; const-Member für const-Zeiger
    }
    

    Gruß,

    Simon2.



  • Tut mir leid ich bin ein noob... ich habe es ehrlich gesagt , trotz eurer klasse Erklärungen nicht GANZ geblickt ... ok was ich geblickt habe ist das nicht beide const sind und beide const sein müssen ... aber die umwandlung habe ich trotzdem noch net ganz raus :S

    bool Becher::ReichtKapazitaet(const Becher* b) const { 
        if(inhalt!=b->inhalt) 
            return(false); 
        return(ReichtKapazitaet( 
            static_cast<int>(b->Fassungsvermoegen/100.0F* 
            b->fuellhoehe))); 
    
    }
    

    könnte bitte mal jmd wirklich DIESEN code abschnitt berichtigen damit ich es fanz verstehe ? :S habe schon bissl mitm abschnit "rumgespielt" ... aber leider hat es nix gebracht .. 😞 ich weiss das euch solche Fragen warscheinlich nerven tut mir leid ich bin ein Anfänger...



  • dangerberk schrieb:

    ...
    könnte bitte mal jmd wirklich DIESEN code abschnitt berichtigen ...

    Das geht nicht (*) , weil sich der Fehler nicht in diesem Code-Abschnitt befindet !!!

    Gruß,

    Simon2.

    P.S.: (*) Natürlich könnte ich da was "schmuddeln", aber das mach' ich nicht, weil die echte Lösung (nämlich hinter die andere Funktion "const" zu schreiben) einfacher, sauber und mit Lerneffekt verbunden ist. :p



  • Simon2 du hattest recht, habe es jetzt auch "geschafft" ... ich war wohl unkonzentriert und habe nicht einmal die Errormessage nach meinem Versuch richtig verstanden ...

    bool ReichtKapazitaet(int ml) const;
    
    bool Becher::ReichtKapazitaet(int ml) const
    

    wenn ich mich nicht irre 🙂

    E:\ btw das der Error nicht in meinem Codeabschnitt im vorherigen Post lag hat mir sehr geholfen^^



  • dangerberk schrieb:

    ...habe es jetzt auch "geschafft" ...

    Glückwunsch !! 😋 👍

    Gruß,

    Simon2.


Anmelden zum Antworten