Tschou Zämä
Ich versuche, ein Struct für eine imaginäre Zahl ein- und auszulesen.
Dafür möchte ich iostream verwenden und diesen in die Methode übergeben.
Irgendwie geht's nicht und die Fehlermeldung hilft mir auch nicht
weiter...
Wer findet das Problem?
Vielen Dank im Voraus!
1
#include<iostream>
2
#include<cmath>
3
#include<cstring>
4
usingnamespacestd;
5
typedefstring::iteratoritStr;
6
doubleepsilon=0.00001;
7
8
structcNumb{
9
doublea;// a+
10
doubleb;//b*i
11
};
12
13
cNumbadd(constcNumbc1,constcNumbc2);
14
cNumboperator+(constcNumbc1,constcNumbc2);
15
cNumbsub(constcNumbc1,constcNumbc2);
16
cNumboperator-(constcNumbc1,constcNumbc2);
17
cNumbmultiply(constcNumbc1,constcNumbc2);
18
cNumboperator*(constcNumbc1,constcNumbc2);
19
cNumbcomplement(constcNumbc1);
20
doubleradOrAbs(constcNumbc1);// radius == Betrag
21
// Divisor, Dividend
22
cNumbdivise(constcNumbc1,constcNumbc2);
23
cNumboperator/(constcNumbc1,constcNumbc2);
24
booloperator==(constcNumbc1,constcNumbc2);
25
booloperator!=(constcNumbc1,constcNumbc2);
26
27
cNumbread(istream&in,constcNumbc1);
28
//cNumb operator >> (istream& in, const cNumb c1);
Es geht um die Theorie, darum, das Struct zu verstehen etc.
Den Operator << möchte ich später auch noch einführen, für Addition und
weiteres habe ich das schon gemacht.
Was sind denn diese 'offensichtlichen' Fehler?
Von Datenströmen verstehe ich noch recht wenig.
HasProblemsWithCpp schrieb:> Von Datenströmen verstehe ich noch recht wenig.
Du meintest wohl "Von C++ verstehe ich noch recht wenig." :)
Zu den fehlern:
In den Zeilen 37,38,46,55:
Das '&' vor den Objekten weglassen bzw. das Kapitel 'Referenzen' in
einem C++ Buch deiner Wahl durchlesen.
Zeilen 56,57,68,77:
'const' sagt dem Compiler, dass ein Parameter einer Funktion nicht
verändert wird, du versuchst es aber trotzdem...
Matthias H. schrieb:> 'const' sagt dem Compiler, dass ein Parameter einer Funktion nicht> verändert wird, du versuchst es aber trotzdem...
Wobei die Sache hier noch weiter geht. Das ist die bewusste Funktion
1
cNumbread(istream&in,constcNumbc1){
2
....
Wenn die Funktion read ein cNumb Objekt als Returnwert liefert, wozu
braucht es dann noch eines als Funktionsargument? Was macht es damit?
Wozu ist dieses nötig?
Bei write ist das so ok, denn write muss ja wissen, welches cNumb Objekt
ausgegeben werden soll. D.h. das muss man dem übergeben. Aber read?
Mir scheint, da gibt es noch mehr Probleme ganz banalerer Natur als nur
Strukturen.
Die Sache mit den Referenzen hast du nicht wirklich verstanden. Oder?
Das Referenz-& in der Argumentliste bedeutet nicht, dass du einfach dann
überall ein & schreiben musst. Ganz im Gegenteil.
Es geht nicht um eine alte Komödie, aber auch mir scheint Kerberos den
Eintritt in die C++-Welt zu verwehren.
Vieles konnte ich beheben! Ein Fehler bleibt:
Es geht um den iostream, genauer um den istream, um cin. Ich kann den
cin nicht anderorts verwenden, nachdem ich ihn read() übergeben habe.
Das Programm sollte fragen, ob es nochmals durchlaufen soll.
Für andere Projekte hat es wunderbar funktioniert -> das Problem liegt
beim cin.
--------------------Aktuelle Version------------------
HasProblemsWithCpp schrieb:> Es geht um den iostream, genauer um den istream, um cin. Ich kann den> cin nicht anderorts verwenden, nachdem ich ihn read() übergeben habe.
Bei der Eingabe drückst du doch bestimmt am Ende Enter, oder? Ich sehe
nirgends, daß das abgeholt wird, also steht es noch im Stream-Puffer
wenn du "Wieder?" fragst, und dann wird das gelesen.
PS:
Hast du schon von Referenzen gelernt?
Denn hier
1
cNumbadd(constcNumbc1,constcNumbc2){
2
...
kannst du dir das const auch sparen.
Beim Funktionsaufruf wird sowieso eine Kopie des Arguments des Aufrufers
gemacht. Ob du die in der Funktion veränderst oder nicht spielt keine
Rolle, da diese Kopie nach Beendigung der Funktion sowieso zerstört
wird.
So hingegen
1
cNumbadd(constcNumb&c1,constcNumb&c2){
2
...
ist das const wichtig, weil jetzt keine Kopie mehr gemacht wird, sondern
die Funktion mit den Originalen des Aufrufers arbeitet. Und in dem Fall
ist es wichtig, dem Aufrufer die Zusicherung zu geben: Die Funktion wird
die beim Aufruf angegebenen Argumente nicht verändern.