Hilfe

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(y) //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::eek: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::eek: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
 
1. Bitte benutze die Code-Tags, damit man den Code besser lesen kann.
2. Am einfachsten sollte das so gehen:
Code:
 ostream& operator<<(ostream& os, const Complex& z)
{  
   os << z.getRe() << z.getIm() < 0 ? "" : "+" << z.getIm() << "*i ";
   return os;
}
 
Hallo jockey2!Ich kriege 2 fehlermeldungen wenn ich das Programm kompiliere
und zwar:

1) In function `std::eek:stream& operator<<(std::eek:stream&, const Complex&)':

Zeile:
os << z.getRe() << z.getIm() < 0 ? "" : "+" << z.getIm() << "*i "; mit folgendem Fehler:
2) invalid operands of types `const char[2]' and `double' to binary `operator<<'

und dankeschön für die schnelle antwort

PS: werde nächstes mal code tag benutzen
 
Hatte die Klammern vergessen, sorry. So geht es:
Code:
os << z.getRe() << (z.getIm() < 0 ? "" : "+") << z.getIm() << "*i ";
Weißt du denn, was der Ausdruck
Code:
z.getIm() < 0 ? "" : "+"
bedeutet? Wenn ja, hättest Du mit etwas Nachdenken auch selber darauf kommen können.

Die anderen Fragen im unteren Teil des Codes sind klar?
 
Zurück