Programmierung objektorientiert



  • * Erzeugt ein neues Objekt, dessen Attribute mit den angegebenen
    * Werten initialisiert werden.
    *
    * Falls Name oder Ausführende(r) (performer) leer sind, werden
    * die Default-Werte verwendet.
    *
    * Die Angabe der Bitrate erfolgt in bit/s.
    *
    * Die Bitrate muss zwischen 32000 und 320000 bit/s liegen.
    * Falls diese Zusicherung verletzt wird, werden die Attribute
    * m_bitRate, m_duration und m_contentSize auf 0 gesetzt.

    Stand im Header so?

    Oder ist das falsch?



  • cbaby schrieb:

    * Die Bitrate muss zwischen 32000 und 320000 bit/s liegen.
    * Falls diese Zusicherung verletzt wird, werden die Attribute
    * m_bitRate, m_duration und m_contentSize auf 0 gesetzt.

    Stand im Header so?

    Was hat der angemeckerte Test mit dieser Beschreibung zu tun?



  • Wie solle es dann richtig sein?



  • cbaby schrieb:

    Wie solle es dann richtig sein?

    Das herauszufinden ist deine Hausaufgabe.



  • cbaby schrieb:

    Wie solle es dann richtig sein?

    Anstatt eine Gegenfrage zu stellen, könntest du ja auch mal eine Antwort auf die Frage von Swordfish geben.

    Swordfish hat zurecht 2 if-Abfragen angemeckert. Bei beiden ist es irrelevant, ob man die zugehörige Aufgabenstellung kennt. Die Antwort auf eine Frage wie "ist die Zahl x größergleich 0 oder kleinergleich null" ist zum Beispiel immer "ja", daher ist das if recht nutzlos...



  • CTitle::CTitle(int contentSize, int duration, string name, string performer, int bitRate) //keine elementinitialisierungsliste? 
    { 
        m_contentSize = contentSize;
    
        m_duration = duration;
    }
    

    Oder ist der Konstruktor einfach das ?



  • Welche Anforderungen aus dem Text hast du damit erfüllt? Sind das alle?



  • Mittlerweile ein wenig weiter .

    Aber viele Fehler bei der if bedingung 😃
    Alles neuland für mich

    #include "CTitle.h"
    #include <string>
    #include<iostream>
    using namespace std;
    
    CTitle::CTitle(int contentSize, int duration, string name, string performer, int bitRate)
    {
    	//Die Bitrate muss zwischen 32000 und 320000 bit/s liegen.
    	if (bitRate >= 32000 && bitRate <= 320000)
    	{
    		m_contentSize = contentSize;
    		m_duration = duration;
    		m_bitRate = bitRate;
    	}
    	else
    	{
    	//Falls diese Zusicherung verletzt wird, werden die Attribute
    	//m_bitRate, m_duration und m_contentSize auf 0 gesetzt.
    		m_contentSize = 0;
    		m_duration = 0;
    		m_bitRate = 0;
    	}
    
    }
    
     string CTitle::getName() const
    {
    	return m_name;
    }
    
    string CTitle::getPerformer() const
    {
    	return m_performer;
    }
    
    int CTitle::getDuration() const
    {
    	return m_duration;
    }
    
    double CTitle::getContentsize(){
    
    	return m_contentSize;
    }
    ostream& operator<< (ostream& lop, CTitle& rop){
    
    	lop<< &rop << " " << rop.getName();
    	lop<< "; " << rop.getPerformer();
    	lop<< " ; " << rop.getDuration();
    	lop << " s"; //Ausgabe um s erweitert
    
    	if (rop.m_contentSize > 9999 * 1024){ // > 9999 KiB
    		lop << rop.m_contentSize / (1024 * 1024) << " MiB";
    	}
    	else if (rop.m_contentSize > 9999){ // > 9999 B{
    		lop << rop.m_contentSize / 1024 << " KiB";
    	}
    	else{
    		lop << rop.m_contentSize << " B"
    	}
    	}
    
    return lop;
    
    }
    

    header

    #ifndef CTITLE_H_
    #define CTITLE_H_
    
    #include <string>
    using namespace std;
    
    /**
     * Diese Klasse beschreibt einen MP3-kodierten Titel (Song).
     */
    class CTitle
    {
    private:
    	/** Name (Titel) des Songs */
    	string m_name;
    
    	/** Ausführende(r) (Interpret, Gruppe, Orchester o. ä.) */
    	string m_performer;
    
    	/** Die Dauer des Titels in Sekunden. */
    	int m_duration;
    
    	/** Die Bitrate in bit/s. */
    	int m_bitRate;
    
    	/** Die Größe (Anzahl der Bytes) der Audiodaten. */
    	int m_contentSize;
    
    public:
    	/**
    	 * Erzeugt ein neues Objekt, dessen Attribute mit den angegebenen
    	 * Werten initialisiert werden.
    	 *
    	 * Falls Name oder Ausführende(r) (performer) leer sind, werden
    	 * die Default-Werte verwendet.
    	 *
    	 * Die Angabe der Bitrate erfolgt in bit/s.
    	 *
    	 * Die Bitrate muss zwischen 32000 und 320000 bit/s liegen.
     	 * Falls diese Zusicherung verletzt wird, werden die Attribute
    	 * m_bitRate, m_duration und m_contentSize auf 0 gesetzt.
    	 */
    	CTitle(int contentSize = 0, int duration = 0,
    		   string name = "(Untitled)", string performer = "(Unknown)",
    		   int bitRate = 128000);
    
    	/**
    	 * Diese Methode liefert den Namen des Titels.
    	 */
    	string getName() const;
    
    	/**
    	 * Diese Methode liefert den Ausführenden (Performer).
    	 */
    	string getPerformer() const;
    
    	/**
    	 * Diese Methode liefert die Dauer (Länge) des Titels in Sekunden.
    	 */
    	int getDuration() const;
    
    	double getContentsize();
    
    };
    ostream& operator<< (ostream& lop, CTitle& rop);
    
    #endif /* CTITLE_H_ */
    

    Description Resource Path Location Type
    'int CTitle::m_contentSize' is private CTitle.h /CTitle line 34 C/C++ Problem
    expected ';' before '}' token CTitle.cpp /CTitle line 64 C/C++ Problem
    expected declaration before '}' token CTitle.cpp /CTitle line 69 C/C++ Problem
    expected unqualified-id before 'return' CTitle.cpp /CTitle line 67 C/C++ Problem
    within this context CTitle.cpp /CTitle line 56 C/C++ Problem
    within this context CTitle.cpp /CTitle line 57 C/C++ Problem
    within this context CTitle.cpp /CTitle line 59 C/C++ Problem
    within this context CTitle.cpp /CTitle line 60 C/C++ Problem
    within this context CTitle.cpp /CTitle line 63 C/C++ Problem



  • Damit die Operator-Funktion auf private Member zugreifen kann, muß sie mit der Klasse befreundet sein:

    class CTitle
    {
        // ...
    
        // wichtig: innerhalb der Klasse deklarieen
        friend ostream& operator<< (ostream& lop, CTitle& rop);
    };
    

    Oder aber du benutzt besser gleich die getContentsize() Funktion innerhalb des Operators (wie bei den anderen Membern ja auch)!
    Diese Funktion sollte dann aber auch 'const' sein und beim Stream-Operator solltest du dann "const CTitle&" benutzen.

    Und die restlichen Syntaxfehler solltest du selber lösen können.

    PS: Ungarische Notation solltest du vermeiden (d.h. statt CTitel einfach Title).



  • WIe bekomme ich die fehler in der if bedingung weg ?



  • Im gezeigten Code hast du ein ';' zu wenig und eine '}' zuviel.



  • #include "CTitle.h"
    #include <string>
    #include<iostream>
    using namespace std;
    
    CTitle::CTitle(int contentSize, int duration, string name, string performer, int bitRate)
    {
    	//Die Bitrate muss zwischen 32000 und 320000 bit/s liegen.
    	if (bitRate >= 32000 && bitRate <= 320000)
    	{
    		m_contentSize = contentSize;
    		m_duration = duration;
    		m_bitRate = bitRate;
    	}
    	else
    	{
    	//Falls diese Zusicherung verletzt wird, werden die Attribute
    	//m_bitRate, m_duration und m_contentSize auf 0 gesetzt.
    		m_contentSize = 0;
    		m_duration = 0;
    		m_bitRate = 0;
    	}
    
    }
    
     string CTitle::getName() const
    {
    	return m_name;
    }
    
    string CTitle::getPerformer() const
    {
    	return m_performer;
    }
    
    int CTitle::getDuration() const
    {
    	return m_duration;
    }
    
    double CTitle::getContentsize(){
    
    	return m_contentSize;
    }
    ostream& operator<< (ostream& lop, CTitle& rop){
    
    	lop<< &rop << " " << rop.getName();
    	lop<< "; " << rop.getPerformer();
    	lop<< " ; " << rop.getDuration();
    	lop << " s"; //Ausgabe um s erweitert
    
    	if (rop.m_contentSize > 9999 * 1024){ // > 9999 KiB
    		lop << rop.m_contentSize / (1024 * 1024) << " MiB";
    	}
    	else if (rop.m_contentSize > 9999){ // > 9999 B{
    		lop << rop.m_contentSize / 1024 << " KiB";
    	}
    	else{
    		lop << rop.m_contentSize << " B"
    	}
    
    return lop;
    
    }
    

    Finde den anderen Fehler nicht 😃



  • Dann nimmst du die erste Zeilnenummer der Fehlermeldung und suchst nach oben.

    Nebenbei: name und performer im Konstruktor willst du nicht verwenden?



  • Was ist an dem contentSize falsch solch ich es als int lassen ?

    Die int methode war so gegeben anhand der Aufgabe.

    Die get Methode habe ich als double implementiert selbst?

    Oder soll ich beides int lassen ?

    Mir nicht so klar.

    #ifndef CTITLE_H_
    #define CTITLE_H_
    
    #include <string>
    using namespace std;
    
    /**
     * Diese Klasse beschreibt einen MP3-kodierten Titel (Song).
     */
    class CTitle
    {
    private:
    	/** Name (Titel) des Songs */
    	string m_name;
    
    	/** Ausführende(r) (Interpret, Gruppe, Orchester o. ä.) */
    	string m_performer;
    
    	/** Die Dauer des Titels in Sekunden. */
    	int m_duration;
    
    	/** Die Bitrate in bit/s. */
    	int m_bitRate;
    
    	/** Die Größe (Anzahl der Bytes) der Audiodaten. */
    	int m_contentSize;
    
    public:
    	/**
    	 * Erzeugt ein neues Objekt, dessen Attribute mit den angegebenen
    	 * Werten initialisiert werden.
    	 *
    	 * Falls Name oder Ausführende(r) (performer) leer sind, werden
    	 * die Default-Werte verwendet.
    	 *
    	 * Die Angabe der Bitrate erfolgt in bit/s.
    	 *
    	 * Die Bitrate muss zwischen 32000 und 320000 bit/s liegen.
     	 * Falls diese Zusicherung verletzt wird, werden die Attribute
    	 * m_bitRate, m_duration und m_contentSize auf 0 gesetzt.
    	 */
    	CTitle(int contentSize = 0, int duration = 0,
    		   string name = "(Untitled)", string performer = "(Unknown)",
    		   int bitRate = 128000);
    
    	/**
    	 * Diese Methode liefert den Namen des Titels.
    	 */
    	string getName() const;
    
    	/**
    	 * Diese Methode liefert den Ausführenden (Performer).
    	 */
    	string getPerformer() const;
    
    	/**
    	 * Diese Methode liefert die Dauer (Länge) des Titels in Sekunden.
    	 */
    	int getDuration() const;
    
    	double getContentsize();
    
    };
    ostream& operator<< (ostream& lop, CTitle& rop);
    
    #endif /* CTITLE_H_ */
    


  • Hä?



  • Deutsch wäre ein guter Ansatz.



  • Was meint ihr mit deutsch ?



  • cbaby schrieb:

    Was ist an dem contentSize falsch solch ich es als int lassen ?
    [...]
    Die get Methode habe ich als double implementiert selbst?

    Und lass das plenken sein.

    EDIT: Und Satzfragmente sind auch ganz, ganz schlecht für das Verständnis. Deutsch ist eine relativ präzise Sprache, also nutze sie auch, dein Problem präzise zu beschreiben.



  • Der Compiler zeigt bei int contentSize einen Fehler ?

    Warum ?



  • Ich würd' mal sagen, weil da ein Fehler ist.

    Sag mal, willst du uns verarschen, oder bist du so naiv?


Anmelden zum Antworten