Programmierung objektorientiert



  • in contentSize wird die größe in bytes gespeichert;
    wenn du deine CTitle-instanz allerdings über cout ausgibts, dann soll die größe aber in einer passenden, menschenlesbaren einheit dargestellt werden. dafür musst du die größe natürlich umwandeln und runden. z.b. durch 1024 dividieren und aufrunden, wenn der rest >= 512 ist. allerdings nur, wenn contentSize mehr als vier dezimalstellen hat. und das ganze höchstens zweimal, einmal für die umwandlung von bytes in KiB und einmal für die umwandlung von KiB in MiB.

    mit präfix meint die aufgabenstellung das "Ki" und das "Mi".



  • Auf jeden Fall muss man da irgendwie eine if bedingung einbauen?

    Aber wie erkläre ich dem Programm das er 4bit darstellen soll?

    contentSize würde ich ja irgendwie so ausgeben:

    this->contentSize;

    sizeof(contentSize)= 4;

    x= (contentSize)/(1024);

    if(sizeof(contentSize)>= 4){

    }

    das wäre so meine Idee



  • Was soll

    cbaby schrieb:

    // ...
    
    	if(m_contentSize < 0 || m_contentSize > 0){
    
    		m_contentSize = contentSize;
    	}
    	else{
    		m_contentSize = 0;
    	}
    
    	if(m_duration <= 0 || m_duration >= 0){
    
    		m_duration = duration;
    	}
    	else{
    		m_duration = 0;
    	}
    

    denn?



  • * 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 ?


Anmelden zum Antworten