C++ Komplexe Zahlen Klasse



  • class Complex
    {
    public:
        Complex(double r, double i)
        {
            m_real = r;
            m_imag = i;
        }
        ~Complex (){};
    

    du hast hier nirgens m_imag und m_real deklariert und in Zeile 75 auf einmal:

    private:
    double m_real, m_imag;
    

    Komplett verwirrt?

    gruß
    syntax



  • Syntax_error schrieb:

    ...Komplett verwirrt?...

    Könnte es sein das du es bist? Es sind Membervariablen die im Konstruktor verwendet werden, was ist daran auszusetzen? (Auch wenn ich die Initialisierungsliste statt der Zuweisung vorziehen würde).



  • Fehlt vielleicht ein Include <sstream>?



  • asc schrieb:

    Fehlt vielleicht ein Include <sstream>?

    ja hat gefehlt! Mein Chef setzt sich auch gerade damit auseinander, versteht aber auch nicht warum es dann heißt

    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(42) : error C2804: Binärer Operator '<<' hat zu viele Parameter
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(42) : error C2333: 'Complex::operator <<': Fehler in Funktionsdeklaration; Funktionstext wird übersprungen
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\main.cpp(14) : error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'Complex' akzeptiert (oder keine geeignete Konvertierung möglich)
    1>
    

    Aktuell sieht die Headerfile jetzt so aus:

    #include <sstream>
    
    class Complex
    {
    public:
    	Complex(double r, double i)
    	{
    		m_real = r;
    		m_imag = i;
    	}
    	~Complex (){};
    
    	const std::string Complex::toStdString() const
    	{
    		std::ostringstream os;
    		os << m_real << " + " << m_imag << "i";
    
    		if (m_real == 0)
    		{
    			os << m_imag << "i";
    		}
    
    		if (m_imag == 0)
    		{
    			os << m_real;
    		}
    
    		if (m_imag < 0)
    		{
    			os << m_real << m_imag << "i";
    		}
    		return os.str();
    
    	}
    
    	std::ostream& operator << (std::ostream& os, const Complex &o)
    	{
    		return os << o.toStdString();
    	}
    
    	Complex operator + (const Complex &o)
    	{	
    		return Complex(o.m_real + m_real, o.m_imag + m_imag);
    	}
    
    	Complex operator - (const Complex &o)
    	{
    		return Complex(o.m_real - m_real, o.m_imag - m_imag);
    	}
    
    	Complex operator * (const Complex &o)
    	{
    		return Complex((o.m_real * m_real) - (o.m_imag * m_imag), (o.m_real * m_imag) + (o.m_imag * m_real));
    	}
    
    	Complex operator / (const Complex &o)
    	{
    		return Complex(((o.m_real * m_real) + (o.m_imag * m_imag)) /((m_real * m_real) + (m_imag * m_imag)),
    			((o.m_imag * m_real) - (o.m_real * m_imag)) / (( m_real * m_real) + (m_imag * m_imag)));
    	}
    
    private:
    double m_real, m_imag;
    
    //protected:
    
    };
    


  • Dein operator<< ist immer noch ein Member und keine freie Funktion



  • Dein operator<< ist keine freie Funktion! Wurde eigentlich oft genug erwähnt dass das falsch ist. Ich hatte auch gehofft ich hätte erklärt, warum diese Fehlermeldung auftritt.



  • daddy_felix schrieb:

    Dein operator<< ist immer noch ein Member und keine freie Funktion

    :DD ahh danke euch allen!

    habe es jetzt als freie Funktion geschrieben.. und jetzt funktioniert es!

    Ich kann dieses Forum nur an alle weiter empfehlen!
    Liebe Grüße


  • Mod

    Was genau macht deiner Meinung nach eigentlich Zeile 11?



  • @SeppJ: mein Chef meinte ich sollte noch einen Destruktor reinschreiben.. also habe ich das gemacht.. Dient zur Freigebung benutzter Ressourcen 😉



  • wenn der destruktor leer ist, kannst du ihn auch gleich weg lassen, da der compiler dann einen für dich erzeugt.



  • danke 😉 wie schon gesagt, bin bei den Anfängen



  • scanbot90 schrieb:

    @SeppJ: mein Chef meinte ich sollte noch einen Destruktor reinschreiben..

    Wenn du keinen eigenen Destruktor schreibst, wird automatisch ein Leerer erzeugt.

    Sprich: Du machst nichts anderes, als du bekommen würdest, wenn du ihn unnötigerweise selbst leer implementierst.

    scanbot90 schrieb:

    Dient zur Freigebung benutzter Ressourcen 😉

    Schön aus dem Lehrbuch rezitiert, aber unsinnig, wenn du keine Aufräumarbeiten durchführst.


Anmelden zum Antworten