C++ Komplexe Zahlen Klasse
-
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ß
syntaxdanke 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 geholfenDu 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' istAlso 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
-
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