Komplexe Zahlen Beispiel
-
SeppJ schrieb:
Hier hast du eine andere C++-Faustregel, die wesentlich besser ist, als die aus deiner Vorlesung: Kein new!
Merk ich mir, danke.
Sozusagen auf diese Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber(a_, b_); }
-
pascal_77 schrieb:
Sozusagen auf diese Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber(a_, b_); }Nein! (vermute ich...)
"Rückgabewert
Die invertierte komplexe Zahl (als neues Objekt) "Ich verstehe das so, dass ein neues Objekt erstellt werden soll, würde das also folgendermaßen lösen:
ComplexNumber CreateInverted() const { return ComplexNumber(-a_, -b_); }
-
pascal_77 schrieb:
SeppJ schrieb:
Hier hast du eine andere C++-Faustregel, die wesentlich besser ist, als die aus deiner Vorlesung: Kein new!
Merk ich mir, danke.
Sozusagen auf diese Art?
ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber(a_, b_); }manni66 schrieb:
Grundsätzlich solltest du deine Programme auch übersetzen. Papier macht allenfalls in der Prüfung Sinn.
Dann würde der Compiler dir nämlich sagen, dass a_ und b_ unbekannt sind.
manni66 schrieb:
Wenn von Methode gesprochen wird, kannst du davon ausgehen, dass eine Klassenfunktion gemeint ist. Was soll dann wohl invertiert werden?
Wie invertierst du 40+2i mit deiner Funktion?
-
pascal_77 schrieb:
manni66 schrieb:
Da fängst du ja recht früh an ...
Destruktor und dann auch noch virtuell - warum?
Kopierkonstruktor selbst definiert, privat und auch noch falsch - warum?
Wir müssen den Copy Constructor nach Defintion immer private machen
Zitat Vorlesungsfolie: Faustregel: Jede Klasse muss einen expliziten Copy (private)
Constructor haben (für deep copy)
Dasselbe gilt für den Destructor..Faustregel != wir müssen
Hier gibt es keine deep copy, der Compiler macht alles wunderbar selber richtig. Deine Implementierung des Kopierkonstruktors ist aber schlicht falsch, denn sie kopiert nichts.Wurde in der Vorlesung vielleicht davon gesprochen:
http://de.wikipedia.org/wiki/Dreierregel
-
manni66 schrieb:
Wurde in der Vorlesung vielleicht davon gesprochen:
http://de.wikipedia.org/wiki/DreierregelGenau davon wurde gesprochen, ja!
Ich dachte ich bin am richtigen Weg. Ich habe das Programm nun schnell abgetippt und die invertier-Funktion funktioniert eigentlich....
Was stimmt noch nicht?Programm:
class ComplexNumber { private: float a_, b_; //hier fehlte das Objekt ComplexNumber(const ComplexNumber& rhs) {} public: ComplexNumber(): a_(0), b_(0) {} ComplexNumber(float a, float b): a_(a), b_(b) {} ~ComplexNumber() {} float getA() {return a_;} float getB() {return b_;} ComplexNumber invertNumber() { a_ = -a_; b_ = -b_; return ComplexNumber((-a_), (-b_)); } friend bool operator>(const ComplexNumber& a, const ComplexNumber& b) { return sqrt(a.a_*a.a_ + a.b_*a.b_) > sqrt(b.a_*b.a_ + b.b_*b.b_); } }; int main() { ComplexNumber *c = new ComplexNumber(40.0,2.0); c->invertNumber(); std::cout << c->getA() << " " << c->getB() << std::endl; }
-
pascal_77 schrieb:
Ich dachte ich bin am richtigen Weg. Ich habe das Programm nun schnell abgetippt und die invertier-Funktion funktioniert eigentlich....
Was stimmt noch nicht?die Invertier-Funktion verändert die aktuelle Instanz. Soll das wirklich so sein? Würde mich sehr wundern... zumal in der Aufgabenstellung explizit steht, dass ein ComplexNumber zurückgegeben werden soll. Das machst du zwar auch, aber wo ist da der Sinn, wenn die Instanz selbst verändert wird? Da ist der Rückgabewert mal komplett überflüssig
-
Ah da hast Recht. Ich werd das Objekt bestimmt nicht verändern drüfen..
Langsam kommt mir vor ich bin auf dem Holzweg...
Auf die Art würde ich ein neues Objekt zurückgeben und das alte unverändert bleiben..?ComplexNumber invertNumber() { ComplexNumber c; c.a_ = -a_; c.b_ = -b_; return c; }
-
pascsal_77 schrieb:
Auf die Art würde ich ein neues Objekt zurückgeben und das alte unverändert bleiben..?
Schau dir doch mal an, welche Konstruktoren du zur Verfügung hast... und anschließend, was ich hier um 9:57 gepostet habe

-
daddy_felix schrieb:
Schau dir doch mal an, welche Konstruktoren du zur Verfügung hast... und anschließend, was ich hier um 9:57 gepostet habe

Ah okay, danke.
Das einzige Problem dass jetzt noch offen ist, ist dass der Compiler schreit dass der Copy-Constructor private ist. Kommentiere ich ihn aus funktioniert alles. Ist der return Wert in der Methode jetzt ein Verweis auf den CC? Oder benötige ich diesen gar nicht?
-
Du versuchst sowas hier:
ComplexNumber c1(2,4); ComplexNumber c2 = c1.inverted();das ist äquivalent zu:
ComplexNumber c1(2,4); ComplexNumber c2(c1.inverted()); // Copy ConstructorAlso ja, hier benötigst du einen Copy Constructor (allerdings keinen eigenen, der automatisch generierte ist in diesem Fall völlig ausreichend)