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 ­čśâ


Log in to reply