Problem mit Beispiel aus Anfänger-Buch
-
Hi,
Ich habe mit dem Buch "Visual C++ 2010" von Galileo Computering angefangen, doch bei einem Punkt komme ich nicht weiter.
Ich habe alles nach bestem Gewissen aus dem Buch abgetippt und kann trotzdem nicht compilen.
main.cpp:
#include <iostream> #include <string> #include "Becher.h" using namespace std; int main () { const Becher b("Milch",300,50); Becher::reichtKapazitaet(const Becher *b);// const ist unterwellt, "Error: Der Typname ist nicht zulässig" b.ausgabe(); system("pause"); }
Becher.cpp:
#include "Becher.h" #include <iostream> using namespace std; void Becher::ausgabe() const { cout << "Becher mit " << this->inhalt << endl; } Becher::Becher(string i, int fa, float fu) :inhalt(i),fassungsvermoegen(fa),fuellhoehe(fu) { } bool Becher::reichtKapazitaet(int ml) const{ float platz = fassungsvermoegen/100.0F*(100-fuellhoehe); return (platz >= ml); } bool Becher::reichtKapazitaet(const Becher *b) const{ if(inhalt != b->inhalt) return (false); return(reichtKapazitaet(static_cast<int>(b->fassungsvermoegen/100.0F*b->fuellhoehe))); }
Becher.h:
#pragma once #include <string> class Becher { private: std::string inhalt; int fassungsvermoegen; float fuellhoehe; public: Becher(std::string i,int fa, float fu); void ausgabe() const; bool reichtKapazitaet(int ml) const; bool reichtKapazitaet(const Becher *b) const; };
Fehlermeldung:
main.cpp(10): error C2143: Syntaxfehler: Es fehlt ')' vor 'const' main.cpp(10): error C2661: 'Becher::reichtKapazitaet': Keine überladene Funktion akzeptiert 0 Argumente main.cpp(10): error C2059: Syntaxfehler: ')'
Ich habe schon - soweit ich das kann - herumprobiert, um möglicherweise selbst das Problem lösen zu können, aber ich brauche bitte eure Hilfe.
Danke im Voraus!
-
Waffelmann schrieb:
Becher::reichtKapazitaet(const Becher *b);// const ist unterwellt, "Error: Der Typname ist nicht zulässig"
Du möchtest hier eine Funktion/Methode aufrufen, nicht deklarieren. Daher ist das
const Becher *b
fehl am Platz. Stattdessen muss du einen Wert übergeben. Entweder vom TypBecher
oder vom Typint
.
-
Lass mich raten: die Initialen des Buchautors sind JW?
Deine bemängelte Zeile ist völlig sinnfrei und auch syntaktisch falsch. Der Compiler hat recht indem er sich weigert, sowas zu compilieren.
-
Wutz schrieb:
Lass mich raten: die Initialen des Buchautors sind JW?
Nein, der ist es ausnahmsweise mal nicht.
http://www.galileocomputing.de/katalog/buecher/titel/gp/titelID-2422
-
Danke, für die Antworten!
Komsch is es mir schon vorgekommen, aber das wars auch schon xDWutz schrieb:
Lass mich raten: die Initialen des Buchautors sind JW?
Meinst du damit, dass das Buch nicht sehr empfehlenswert ist, oder habe ich das falsch interpretiert?
-
Wenn du die o.g. Zeile tatsächlich richtig abgetippt hast, gehört der Autor des Buches in eine Kategorie mit J.Wolf, einem (leider) bekannten Autor desselben Verlages, der sich durch mehrere C/C++ Bücher geoutet hat, welche nachvollziehbar überwiegend falsche, nicht standardkonforme und/oder sinnfreie Codebeispiele enthalten.
Du kannst gerne hier oder in anderen Sub-Foren nach o.g. Herrn mal suchen und dir dort andere Meinungen außer meiner einholen.
-
main.cpp:
#include <iostream> #include <string>//Wird gar nicht benutzt, seltsam. Eine Leiche? #include "Becher.h" using namespace std; int main () { const Becher b("Milch",300,50);//Praxisfernes const Becher::reichtKapazitaet(const Becher *b);//Wie gesagt, völlig sinnfrei b.ausgabe(); system("pause");//Bockmist, in VC einfach mit Strg+F5 starten }
Becher.cpp:
#include "Becher.h" #include <iostream> using namespace std; void Becher::ausgabe() const { cout << "Becher mit " << this->inhalt << endl;//endl schlecht. //Wozu this->? //Warum so eine unvollständige AUsgabe? } Becher::Becher(string i, int fa, float fu) :inhalt(i),fassungsvermoegen(fa),fuellhoehe(fu) { //Ein schlechter Witz! //Inhalt und Fassungsvermögen bedeuten das gleiche. //Und wenn die IDE anzeigt Becher(string i, int fa, float fu), bekomme ich Durst. } bool Becher::reichtKapazitaet(int ml) const{ //ml ist selten ein guter Name float platz = fassungsvermoegen/100.0F*(100-fuellhoehe); //Aha, Fassungsvermögen kontra Platz return (platz >= ml); //Nutzlose Klammern. Es gibt unter den gegenseitig abschreibenden C-Autoren //diesen Stil. Aber nicht in der Außenwelt. //Wer das schreibt, hat keine Praxis, fürchte ich. //Und erst hier erkennt man, daß die Füllhöhe eine Angabe in Prozent ist. //Fazit: Das erfreut mich nicht. } bool Becher::reichtKapazitaet(const Becher *b) const{//Nutzloser Zeiger if(inhalt != b->inhalt) return (false);//Unfug. //Erstens gibt es Colabier, und zweitens geschieht hier eine //dynamische Typprüfung. return(reichtKapazitaet(static_cast<int>(b->fassungsvermoegen/100.0F*b->fuellhoehe))); //Was soll der cast? Ah, oben das int war natürlich falsch. //Und hier wird der Fehler fortgeschrieben, statt ihn oben zu reppen. }
Becher.h:
#pragma once//Wolle zeige, daß wir MS-Spezifisch sind? #include <string> class Becher { private: std::string inhalt; int fassungsvermoegen;//Dann bitte auch ö in Bezeichnern, höhö. float fuellhoehe; //Alle drei Namen sind schlecht. public: Becher(std::string i,int fa, float fu); void ausgabe() const; bool reichtKapazitaet(int ml) const; bool reichtKapazitaet(const Becher *b) const; };
Das ganze Beispiel halte ich für sinnfrei. Als würde Jürgen Wolf der Ghostwriter sein und nun statt Wurstbroten Milchbecher simulieren.
-
Ok, dann ärgere ich mich, dass ich 50 euro geblättert habe.
Alles ist jedoch nicht von dem Beispiel!
Ich habe schon etwas dazugefügt, aber das meiste steht so im Buch.
"#include <string>" und auch "this->" habe ich vergessen zu löschen, aber der Rest ist so im Buch."system("pause");" ist als Tipp im Buch gewesen, damit die Konsole nicht gleich verschwindet, ob Strg+F5 auch im Buch war, weiß ich nichtmehr.
Ich habe früher zwar nur eine Skriptsprache für ein Spiel benutzt, aber manches ist mir doch komisch vorgekommen...jetzt weiß ich, warum.