Programmierung objektorientiert



  • Hallo alle zusammen , vielleicht kann mir jemand beim beseitigen folgender Fehlermeldungen helfen ?

    Ich weiss das hier bei programmierproblemen eher selten hilfen kommen 😃

    http://www.pic-upload.de/view-31419597/gt.png.html

    #ifndef CTITLE_H_
    #define CTITLE_H_
    
    #include <string>
    #include <iostream> //Dieses Include fehlte!
    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;
    
    };
    ostream& operator<< (ostream& lop, CTitle& rop);
    
    #endif /* CTITLE_H_ */
    

    cpp

    #include "CTitle.h"
    #include <string>
    using namespace std;
    
    CTitle::CTitle(int contentSize, int duration, string name, string performer, int bitRate)
    {
    	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;
    	}
    
     m_name = name;
     m_performer = performer;
    
     if(    m_bitRate>=32000 && m_bitRate<= 320000){
    
    	 m_bitRate = bitRate;
     }
    	 else{
    
    		 m_bitRate = 0;
    		 m_duration = 0;
    		 m_contentSize = 0;
    	 }
    }
    
     CTitle::string CTitle::getName() const
    {
    	return m_name;
    }
    
    string CTitle::getPerformer() const
    {
    	return m_performer;
    }
    
    int CTitle::getDuration() const
    {
    	return m_duration;
    }
    
    ostream& operator<< (ostream& lop, CTitle& rop){
    
    	lop<< &rop << " " << rop.getName();
    	lop<< "; " << rop.getPerformer();
    	lop<< " ; " << rop.getDuration();
    	lop << " s"; //Ausgabe um s erweitert
    
    }
    

    Description Resource Path Location Type
    'string' in 'class CTitle' does not name a type CTitle.cpp /CTitle line 50 C/C++ Problem
    Member declaration not found CTitle.cpp /CTitle line 50 Semantic Error
    no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'const char [3]') CTitle.cpp /CTitle line 68 C/C++ Problem
    no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'const char [3]') CTitle.cpp /CTitle line 70 C/C++ Problem
    no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'const char [4]') CTitle.cpp /CTitle line 69 C/C++ Problem
    no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'CTitle*') CTitle.cpp /CTitle line 67 C/C++ Problem



  • CTitle::string?



  • anmerkungen als kommentare:

    #ifndef CTITLE_H_
    #define CTITLE_H_
    
    #include <string>
    #include <iostream> //Dieses Include fehlte!
    
    //using namespace std; //niemals in einem header!
    
    class CTitle
    {
    private: //diese privaten details könnte man auch erst am ende der klassendefinition erwähnen
    
    	std::string m_name; //finde das m_ unnötig.
    	std::string m_performer;
    	int m_duration; //hierfür würde sich std::chrono::duration anbieten
    	int m_bitRate; //generell sind explizite typen besser als rohe ints
    	int m_contentSize; //hier wäre es size_t
    
    public:
    
    	 /*
     	 * Falls diese Zusicherung verletzt wird, werden die Attribute
    	 * m_bitRate, m_duration und m_contentSize auf 0 gesetzt.
             //sinnvoll? oder besser eine exception?
    	 */
    	CTitle(int contentSize = 0, int duration = 0,
    		   string name = "(Untitled)", string performer = "(Unknown)",
    		   int bitRate = 128000);
    
            //die kommentare für diese getter sind völlig überflüssig.
    
    	string getName() const; //evtl. inline definieren? 
    	string getPerformer() const;
    	int getDuration() const;
    
    };
    
    //typischerweise als friend innerhalb der klasse definiert (in diesem fall eher egal, da kein template)
    ostream& operator<< (ostream& lop, CTitle /*const*/& rop); //const vergessen
    
    #endif /* CTITLE_H_ */
    
    #include "CTitle.h"
    #include <string>
    using namespace std;
    
    CTitle::CTitle(int contentSize, int duration, string name, string performer, int bitRate) //keine elementinitialisierungsliste?
    {
    	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;
    	}
    
     m_name = name;
     m_performer = performer;
    
     if(    m_bitRate>=32000 && m_bitRate<= 320000){
    
    	 m_bitRate = bitRate;
     }
    	 else{
    
    		 m_bitRate = 0;
    		 m_duration = 0;
    		 m_contentSize = 0;
    	 }
    }
    
    //wot?
    /*CTitle::*/string CTitle::getName() const
    {
    	return m_name;
    }
    
    string CTitle::getPerformer() const
    {
    	return m_performer;
    }
    
    int CTitle::getDuration() const
    {
    	return m_duration;
    }
    
    ostream& operator<< (ostream& lop, CTitle /*const*/& rop){
    
    	lop<< &rop << " " << rop.getName();
    	lop<< "; " << rop.getPerformer();
    	lop<< " ; " << rop.getDuration();
    	lop << " s"; //Ausgabe um s erweitert
    
    	//vergessen:
             return lop;
    
    }
    


  • ups, übersehen, dass das teil einer aufgabe ist, die sich wohl schwer um meine kommentare schert.



  • Danke Leute endlich Fehler weg .

    Sieht jetzt angenehmer aus 😃 .

    Ist halt so wenn in der Vorlesung nichts beigebracht wird 😃

    Was ich jetzt nicht genau an der Aufgabe verstehe wie ich dieses contentSize ausgeben soll?

    Wie soll ich dieses präfix verwenden ?



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


Anmelden zum Antworten