this zeiger umwandlungs problem *noobish*
-
Also
b.inhalt="Milch"; b.fuellhoehe=50; b.Fassungsvermoegen=300;in der Main kannst du dir sparen, denn die Werte übergibst du ja dadrüber schon dem Konstruktor.
inhalt=i; Fassungsvermoegen=fa; fuellhoehe=fu;im Konstruktor vom Becher kannst du dir auch sparen, denn das machst du schon in der Initialisierungsliste dadrüber.
In welcher Zeile meckert er denn?
-
Er meckert in 75 wie gesagt das ist etwas was ich wieder üben muss ... da deklariere ich mal zu viel xD
(75.. halt dieses b->...)
-
bool Becher::ReichtKapazitaet(int ml) { float platz = Fassungsvermoegen / 100.0 * (100 - fuellhoehe); /* die rechnung verstehe ich nicht -.- Fassungsvermoegen = r*r*h*pi; wenn du dir jz noch über die einheiten klar werden würdest... aber ok ^^ ich vermute mal cm³ also cl... 100 ml == 1 cl; und wo ist jz das problem, an: return (Fassungsvermoegen >= 100*ml); deine extra var. für füllhöhe kapier ich auch nicht, aber mit der würde das dann eben so aussehen: return (r*r*fuellhohe*pi >= 100*ml); //durch pi sollte dann aber alles float sein ^^ du brauchst also die "originalhöhe" noch - oder ist die fuellhöhe hier die richtige höhe? */ return(platz >= ml); } //und warum ist die fkt nicht const? bool Becher::ReichtKapazitaet(const Becher* b) const { if(inhalt!=b->inhalt) //hier meckert er, weil b konstant ist aber inhalt eine variable ist - ich würd ne fkt GetInhalt (void) const schreiben und die aufrufen... return(false); return(ReichtKapazitaet( static_cast<int>(b->Fassungsvermoegen/100.0F* b->fuellhoehe))); } /* die fkt an sich find ich auch wieder nicht so toll... */hab erst ma keine zeit mehr - bye ^^
-
dangerberk schrieb:
Er meckert in 75 wie gesagt das ist etwas was ich wieder üben muss ... da deklariere ich mal zu viel xD...
1.) Kannst du mal versuchen, Deutsch zu schreiben ?
"Satztrennung" wäre z.B. mal eine gute Sache.
2.) Was "meckert" er denn ? Soll ich raten ? Merke: Compilermeldungen sind nicht in erster Linie dazu da, den Bildschirm zu füllen oder den Programmierer zu nerven.Gruß,
Simon2.
-
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 onceportables 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*) constist 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) constwenn 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.