Operator



  • sind das Ansätze genug?



  • Kann mir nur jemand erklären wie ich den Fehler weg bekomme ?

    Diese Hilfe kann man ja im Forum erwarten ,obwohl man sonst alles selbst machen muss 😃

    Schade das es keine hilfe beim implementieren gibt.

    Kennt ihr ein forum ,wo es beim implementieren Hilfe bekommt ?

    #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.getContentsize() > 9999 * 1024){ // > 9999 KiB
    		lop << rop.getContentsize() / (1024 * 1024) << " MiB";
    	}
    	else if (rop. getContentsize() > 9999){ // > 9999 B
    		lop << rop.getContentsize() / 1024 << " KiB";
    	}
    
    	else{
    		lop << rop.getContentsize() << " B";
    	}
    
    return lop;
    
    }
    
    CTitle& operator+(CTitle& lop, CTitle& rop){
    	if(lop.m_bitRate != rop.m_bitRate){
    		cout << lop << endl;
    
    	}
    	if(lop.m_bitRate == rop.m_bitRate){
    		cout <<lop.m_name << endl;
    
    	}
    
    	if(lop.m_name == rop.m_name){
    
    		cout << lop.m_name+rop.m_name << endl;
    
    	}
    
    	if(lop.m_name != rop.m_name){
    
    		cout << lop.m_performer << ", "<< rop.m_performer;
    	}
    
    	m_duration = lop.m_duration + rop.duration;
    	m_contentSize = lop.m_contentSize + rop.m_contentSize;
    
    }
    

    header

    #ifndef CTITLE_H_
    #define CTITLE_H_
    
    #include <string>
    #include <iostream>
    
    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. */
    	double 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();
    
    	friend CTitle& operator+(CTitle& lop, CTitle& rop);
    	friend ostream& operator<< (ostream& lop, CTitle& rop);
    };
    
    #endif /* CTITLE_H_ */
    

    Description Resource Path Location Type
    'm_contentSize' was not declared in this scope CTitle.cpp /CTitle line 107 C/C++ Problem

    Description Resource Path Location Type
    'm_duration' was not declared in this scope CTitle.cpp /CTitle line 106 C/C++ Problem

    Description Resource Path Location Type
    Symbol 'm_contentSize' could not be resolved CTitle.cpp /CTitle line 107 Semantic Error

    Description Resource Path Location Type
    Symbol 'm_duration' could not be resolved CTitle.cpp /CTitle line 106 Semantic Error



  • Beantworte dir mal die Frage, auf welches Objekt sich die beiden Variablen beziehen. Du hast lop und rop... Aber ohne rop/lop?



  • Die beiden Variablen beziehen sich auf die getter Methoden ?

    Aber was müsste ich dann jetzt machen ?



  • Nein, deine Variablen beziehen sich auf gar nichts, daher auch der Fehler.

    Am einfachsten implementierst du den operator+= zuerst. Danach ist operator+ simpel.



  • m_duration += lop.m_duration + rop.duration;
    m_contentSize += lop.m_contentSize + rop.m_contentSize;

    😕



  • Nein, natürlich nicht so!

    Überleg doch mal, was + so macht.

    Insbesondere: soll c = a + b irgendwas an a oder b ändern können? Nein! Daher solltest du in einem operator+ auch nichts an a oder b ändern, d.h. nimme beide Parameter als const& an.

    Wohingehen operator+= anders ist: da änderst du das *this-Objekt (die linke Seite) und das Objekt rechts bleich unverändert.

    +(links, rechts) kann man somit einfach implementieren als: erzeuge Kopie von links, rechne kopie_von_links+=rechts und gib kopie_von_links zurück.

    Siehe zum Beispiel http://www.gotw.ca/gotw/004.htm



  • Einen kleinen Teil habe ich schon ipmlementiert :

    const(CTitle operator+(const CTitle& duration,const CTitle&contentSize){
    CTitle ret(duration);
    ret+= contentSize;

    return ret;
    }

    Bei += was ist da dieses other ?

    Und dieses real und imaginary?



  • Noch tipps ?



  • Ja. Eigeninitiative zeigen.


Anmelden zum Antworten