C++ Komplexe Zahlen Klasse



  • Hallo zusammen 🙂
    ich muss zur Zeit ein Programm in C++ schreiben und nutze dafür Microsoft Visual Studios 2008.
    Das Programm welches ich schreibe dient zur Berechnung von komplexen Zahlen, doch leider komme ich mit den Operatoren nicht zurecht! -.-

    Headerfile: komplexe zahlen.h

    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)));
    	}
    
    	/*
    	Complex operator| (const Complex &o)
    	{
    		return Complex (sqrt((o.m_real * o.m_real) + (o.m_imag * o.m_imag)));
    	}
    	*/
    
    private:
    double m_real, m_imag;
    
    //protected:
    
    };
    

    Mainfile : Main.cpp

    #include <iostream>
    #include "komplexe zahlen.h"
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
    	Complex z1 (5.0, 3.54);
    	Complex z2 (2.5, -3.54);
    	Complex z3 = z1 + z2;
    	Complex z4 = z1 - z2;
    	Complex z5 = z1 * z2;
    	Complex z6 = z1 / z2;
    	//cout << z3 << endl;    
    
            system("pause");
    	return 0;
    
    }
    

    Ich brauche Hilfe beim Umschreiben der Headerfile, damit ich in der Mainfile "z3" ausgeben kann.
    Ich danke schon mal im voraus für eure Vorschläge

    MfG



  • DU kannst auch einfach std::complex benutzen. So wie ich das hier sehe bist du eher Anfaenger in C++. Da hilft in erster Linie ein gutes Buch.



  • Ja du hast recht, ich bin Anfänger aber muss mich aufgrund meines Praktikums damit auseinander setzten.. Leider habe ich ein Dato bekommen um dieses Programm fertig zu stellen (18.06.12) und ersuche deshalb Hilfe in diesem Forum 😉



  • Was bedeutet "komme nicht zurecht"? Stürzt dein Programm ab? Liefert es falsche Ergebnisse? Liefert dein Compiler Fehlermeldungen? Wenn ja, welche?



  • Schau mal ins Magazin, ich glaube es war Januar 2009, da gibts einen Artikel über Operatorüberladung. Vielleicht hilft das weiter.



  • Du musst den Shift-Operator überladen.

    http://www.c-plusplus.net/forum/232010

    Sehr gutes Tut. übrigens. 😉

    gruß
    syntax



  • Compiler Fehlermeldungen:

    1>------ Erstellen gestartet: Projekt: Komplexe Zahlen Versuch 4, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>Main.cpp
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(40) : 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(40) : error C2333: 'Complex::operator <<': Fehler in Funktionsdeklaration; Funktionstext wird übersprungen
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(14) : error C2079: 'os' verwendet undefiniertes class 'std::basic_ostringstream<_Elem,_Traits,_Alloc>'
    1>        with
    1>        [
    1>            _Elem=char,
    1>            _Traits=std::char_traits<char>,
    1>            _Alloc=std::allocator<char>
    1>        ]
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [4]' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [2]' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(19) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(19) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [2]' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(19) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(24) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(24) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(29) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(29) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(29) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [2]' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(29) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(32) : error C2228: Links von ".str" muss sich eine Klasse/Struktur/Union befinden.
    1>        Typ ist 'int'
    1>Das Buildprotokoll wurde unter "file://f:\Programmieren mit c++\Komplexe Zahlen Versuch 4\Komplexe Zahlen Versuch 4\Debug\BuildLog.htm" gespeichert.
    1>Komplexe Zahlen Versuch 4 - 14 Fehler, 4 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Die Rohform meines Programms hatte funktioniert:

    class Complex
    {
    public:
    	Complex(double r, double i)
    	{
    		m_real = r;
    		m_imag = i;
    	}
    	~Complex (){};
    
    	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)));
    	}
    
    	/*
    	Complex operator| (const Complex &o)
    	{
    		return Complex (sqrt((o.m_real * o.m_real) + (o.m_imag * o.m_imag)));
    	}
    	*/
    
    private:
    double m_real, m_imag;
    
    //protected:
    
    };
    
    #include <iostream>
    #include "komplexe zahlen.h"
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
    	Complex z1 (5.0, 3.54);
    	Complex z2 (2.5, -3.54);
    	Complex z3 = z1 + z2;
    	Complex z4 = z1 - z2;
    	Complex z5 = z1 * z2;
    	Complex z6 = z1 / z2;
    	//cout << z3 << endl;
    
    	system("pause");
    	return 0;
    
    }
    

    Jetzt will ich aber, dass er das Ergebnis z3 ausgibt und da komme ich nicht weiter!



  • Syntax_error schrieb:

    Du musst den Shift-Operator überladen.

    http://www.c-plusplus.net/forum/232010

    Sehr gutes Tut. übrigens. 😉

    gruß
    syntax

    danke Syntax_error, das Tut. hab ich mir vor längerer Zeit angeschaut, aber es hat mir nicht wirklich weiter geholfen 😞



  • Du musst den Shift- Operator überladen.

    Dies kommt in die Complex.h

    friend std::ostream& operator<<(std::ostream&, const Complex&);
    

    und dies Complex.cpp

    std::ostream& operator<<(std::ostream& out, const Complex& a){
    
    	out<<"Realanteil: "<<a.get_real()<<std::endl;
    	out<<"Imaginaerteil: "<<a.get_imag()<<std::endl;
    }
    

    gruß
    syntax



  • f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(40) : error C2804: Binärer Operator '<<' hat zu viele Parameter

    "operator<<" nimmt 2 parameter dein "operator<<" nimmt aber 3:
    Einen ostream, ein complex UND den versteckten this-pointer, da es eine methode ist.

    Einfach als freie Funktion implementieren (da sie nicht auf private member von Complex zugreift, muss sie auch nicht ein friend sein)

    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();
    
        }
    
        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)));
        }
    
        /*
        Complex operator| (const Complex &o)
        {
            return Complex (sqrt((o.m_real * o.m_real) + (o.m_imag * o.m_imag)));
        }
        */
    
    private:
    double m_real, m_imag;
    
    //protected:
    
    };
    
    std::ostream& operator << (std::ostream& os, const Complex &o)
    {
            return os << o.toStdString();
    }
    


  • scanbot90 schrieb:

    Compiler Fehlermeldungen:

    1>------ Erstellen gestartet: Projekt: Komplexe Zahlen Versuch 4, 1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(40) : error C2804: Binärer Operator '<<' hat zu viele Parameter
    

    ...
    danke Syntax_error, das Tut. hab ich mir vor längerer Zeit angeschaut, aber es hat mir nicht wirklich weiter geholfen

    Du hättest nochmal genau zu dem Punkt nachlesen sollen, wo der Fehler auftritt (Der erste Fehler ist entscheidend, die restlichen können immer Folgefehler sein).

    Ich rezitiere mal:

    Da der linke Operand das Streamobjekt ist und die Klassen der Standardbibliothek nicht nachträglich erweitert werden können, müssen die Streaming-Operatoren als freie Funktionen definiert werden.

    Bei dir sind es aber Methoden, keine freien Funktionen. Genaueres wirst du im Tutorial unter 3.4 nachlesen können.



  • Sup schrieb:

    f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(40) : error C2804: Binärer Operator '<<' hat zu viele Parameter

    "operator<<" nimmt 2 parameter dein "operator<<" nimmt aber 3:
    Einen ostream, ein complex UND den versteckten this-pointer, da es eine methode ist.

    Einfach als freie Funktion implementieren (da sie nicht auf private member von Complex zugreift, muss sie auch nicht ein friend sein)

    Jetzt wo ich es als Freie Funktion implementiert habe, sind noch mehr Fehlermeldungen aufgetreten!

    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)));
    	}
    
    	/*
    	Complex operator| (const Complex &o)
    	{
    		return Complex (sqrt((o.m_real * o.m_real) + (o.m_imag * o.m_imag)));
    	}
    	*/
    
    private:
    double m_real, m_imag;
    
    //protected:
    
    };
    	std::ostream& operator << (std::ostream& os, const Complex &o)
    	{
    		return os << o.toStdString();
    	}
    
    1>------ Erstellen gestartet: Projekt: Komplexe Zahlen Versuch 4, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>Main.cpp
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(14) : error C2079: 'os' verwendet undefiniertes class 'std::basic_ostringstream<_Elem,_Traits,_Alloc>'
    1>        with
    1>        [
    1>            _Elem=char,
    1>            _Traits=std::char_traits<char>,
    1>            _Alloc=std::allocator<char>
    1>        ]
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const char [4]' ist
    1>f:\programmieren mit c++\komplexe zahlen versuch 4\komplexe zahlen versuch 4\komplexe zahlen.h(15) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const double' ist
    

    Also wie gesagt ich bin Anfänger, also habt gedult mit mir (seit 2,5 Monaten setzte ich mich mit c++ auseinander) 😃



  • scanbot90 schrieb:

    ...

    Bitte poste nur den ersten, maximal die ersten 3 Fehlermeldungen. Grundsätzlich sind viele Fehler auf immer den ersten zurückzuführen.



  • 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


Anmelden zum Antworten