aschlechter
Grünschnabel
Hi zusammen, ich habe folgendes Problem. Ich muss bei dem unterem
Programm:
#include <iostream>
using namespace std;
class Complex { //Klassendefinition
private: //Zugriffsspezifizierer
double re;
double im;
public: //Zugriffsspezifizierer
//Folgender Konstruktor kann mit keinem, mit einem oder mit zwei
//Argumenten aufgerufen werden (Verwendung von Default-Werten).
//Die Defaultwerte stehen bereits in der Deklaration, so dass sie
//fuer einen Benutzer der Klasse sichtbar sind (Schnittstelle!)
Complex(const double x=0.0, const double y=0.0); //Konstruktor
void setRe(const double);
void setIm(const double);
double getRe() const;
double getIm() const;
//+ als Memberfunktion:
Complex operator+(const Complex&) const;
//+= als Memberfunktion:
Complex& operator+=(const Complex&);
//- als friend Funktion (Def. ausserhalb des Klassenrumpfes)
friend Complex operator-(const Complex&, const Complex&);
};
//Der Konstruktor kann mit keinem, mit einem oder mit zwei
//Argumenten aufgerufen werden (Verwendung von Default-Werten
//in der Deklaration des Konstruktors innerhalb der Klasse):
Complex::Complex(const double x, const double y) //Konstruktor
: re(x), im
//Initialisiererliste
{
return; //Im Rumpf wird nichts getan
}
void Complex::setRe(const double x) { re=x; return; }
void Complex::setIm(const double y) { im=y; return; }
double Complex::getRe() const { return re; }
double Complex::getIm() const { return im; }
//+ als Memberfunktion:
Complex Complex:
perator+(const Complex& z) const
{ //+-Operator als Memberfunktion; nur ein
Argument. Das
//erste Argument ist ueber den implizit vorhandenen this-Pointer
//ansprechbar. Der Aufruf a+b entspricht a.operator+(b)
Complex r; //Konstruktoraufruf ohne Argument
r.re= (*this).re + z.re;
r.im= (*this).im + z.im;
return r;
}
//+= als Memberfunktion:
Complex& Complex:
perator+=(const Complex& z)
{
re+= z.re;
im+= z.im;
return *this; //gib modifiziertes Objekt zurueck
}
//Arithmetische Operatoren - und * n i c h t als Memberfunktionen:
Complex operator-(const Complex& z, const Complex& w)
{ //Keine Memberfunktion, also zwei Argumente.
Complex r;
r.re=z.re-w.re; //Zugriffe auf private Attribute erlaubt, da friend
r.im=z.im-w.im;
return r;
}
Complex operator*(const Complex& z, const Complex& w)
{ //Globale Funktion, aber nicht friend.
//Zugriffe nur ueber public-Schnittstelle!
Complex r;
r.setRe(z.getRe()*w.getRe() - z.getIm()*w.getIm());
r.setIm(z.getRe()*w.getIm() + z.getIm()*w.getRe());
return r;
}
ostream& operator<<(ostream& os, const Complex& z)
{
os << z.getRe() << "+" << z.getIm() << "*i ";
return os;
}
int main()
{
Complex a(0,1), b(2,3); //Konstruktoraufrufe mit zwei Argumenten
cout << a+b << endl; //wird vom Compiler umgesetzt in:
cout << a.operator+(b) << endl;
cout << a-b << endl; //operator-(a,b)
cout << a*b << endl; //operator*(a,b)
a+=b; //a.operator+=(b)
cout << a << endl;
return 0;
}
/*
2+4*i
2+4*i
-2+-2*i <== Ausgaberoutine sollte verbessert werden (Aufgabe)
-3+2*i
2+4*i
Weitere Fragen:
Wie werden Objekte des Datentyps Complex zerstoert (freigegeben)?
Wie laeuft die Parameteruebergabe bei Funktionsaufrufen und die
Rueckgabe des Funktionsergebnisses ab?
*/
den quelltext so überarbeiten, dass komplexe Zahlen ”schön“ ausgegeben werden (z.B. nicht -2+-2*i).
Ich danke für die Hilfe
ciao
Programm:
#include <iostream>
using namespace std;
class Complex { //Klassendefinition
private: //Zugriffsspezifizierer
double re;
double im;
public: //Zugriffsspezifizierer
//Folgender Konstruktor kann mit keinem, mit einem oder mit zwei
//Argumenten aufgerufen werden (Verwendung von Default-Werten).
//Die Defaultwerte stehen bereits in der Deklaration, so dass sie
//fuer einen Benutzer der Klasse sichtbar sind (Schnittstelle!)
Complex(const double x=0.0, const double y=0.0); //Konstruktor
void setRe(const double);
void setIm(const double);
double getRe() const;
double getIm() const;
//+ als Memberfunktion:
Complex operator+(const Complex&) const;
//+= als Memberfunktion:
Complex& operator+=(const Complex&);
//- als friend Funktion (Def. ausserhalb des Klassenrumpfes)
friend Complex operator-(const Complex&, const Complex&);
};
//Der Konstruktor kann mit keinem, mit einem oder mit zwei
//Argumenten aufgerufen werden (Verwendung von Default-Werten
//in der Deklaration des Konstruktors innerhalb der Klasse):
Complex::Complex(const double x, const double y) //Konstruktor
: re(x), im

{
return; //Im Rumpf wird nichts getan
}
void Complex::setRe(const double x) { re=x; return; }
void Complex::setIm(const double y) { im=y; return; }
double Complex::getRe() const { return re; }
double Complex::getIm() const { return im; }
//+ als Memberfunktion:
Complex Complex:

{ //+-Operator als Memberfunktion; nur ein
//erste Argument ist ueber den implizit vorhandenen this-Pointer
//ansprechbar. Der Aufruf a+b entspricht a.operator+(b)
Complex r; //Konstruktoraufruf ohne Argument
r.re= (*this).re + z.re;
r.im= (*this).im + z.im;
return r;
}
//+= als Memberfunktion:
Complex& Complex:

{
re+= z.re;
im+= z.im;
return *this; //gib modifiziertes Objekt zurueck
}
//Arithmetische Operatoren - und * n i c h t als Memberfunktionen:
Complex operator-(const Complex& z, const Complex& w)
{ //Keine Memberfunktion, also zwei Argumente.
Complex r;
r.re=z.re-w.re; //Zugriffe auf private Attribute erlaubt, da friend
r.im=z.im-w.im;
return r;
}
Complex operator*(const Complex& z, const Complex& w)
{ //Globale Funktion, aber nicht friend.
//Zugriffe nur ueber public-Schnittstelle!
Complex r;
r.setRe(z.getRe()*w.getRe() - z.getIm()*w.getIm());
r.setIm(z.getRe()*w.getIm() + z.getIm()*w.getRe());
return r;
}
ostream& operator<<(ostream& os, const Complex& z)
{
os << z.getRe() << "+" << z.getIm() << "*i ";
return os;
}
int main()
{
Complex a(0,1), b(2,3); //Konstruktoraufrufe mit zwei Argumenten
cout << a+b << endl; //wird vom Compiler umgesetzt in:
cout << a.operator+(b) << endl;
cout << a-b << endl; //operator-(a,b)
cout << a*b << endl; //operator*(a,b)
a+=b; //a.operator+=(b)
cout << a << endl;
return 0;
}
/*
2+4*i
2+4*i
-2+-2*i <== Ausgaberoutine sollte verbessert werden (Aufgabe)
-3+2*i
2+4*i
Weitere Fragen:
Wie werden Objekte des Datentyps Complex zerstoert (freigegeben)?
Wie laeuft die Parameteruebergabe bei Funktionsaufrufen und die
Rueckgabe des Funktionsergebnisses ab?
*/
den quelltext so überarbeiten, dass komplexe Zahlen ”schön“ ausgegeben werden (z.B. nicht -2+-2*i).
Ich danke für die Hilfe
ciao