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 Typ Becher oder vom Typ int .



  • 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 xD

    Wutz 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. 😞


Anmelden zum Antworten