18. marts 2006 - 13:41
Der er
53 kommentarer
hjælp hurtig
Jer ved at lave et program som skal arbejde med brøker og jeg skal lave nogle friends til min class men kan ikke få det til at virke. Jeg smider lige koden op her. Header filen. class Rational { friend Rational &operator+ (int &, Rational &); public: Rational(int = 0, int = 1); void red(void); int getOver(void); int getNed(void); void add(Rational, Rational); void sub(Rational, Rational); void mul(Rational, Rational); void div(Rational, Rational); private: int over,ned; }; Opsætningsfilen. #include <iostream> using namespace std; #include "brok.h" Rational::Rational(int o, int n) { if (n == 1) { n = 0; } over = o; ned = n; } int Rational::getNed() { return ned; } int Rational::getOver() { return over; } void Rational::red() { int taeller; for (taeller = 2; taeller <= over; taeller++) { while (over % taeller == 0 && ned % taeller == 0) { over = over / taeller; ned = ned / taeller; } } } void Rational::add(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getNed()); over = (brok1.getOver() * brok2.getNed()) + (brok2.getOver()* brok1.getNed()); red(); } void Rational::sub(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getNed()); over = (brok1.getOver() * brok2.getNed()) - (brok2.getOver()* brok1.getNed()); red(); } void Rational::mul(Rational brok1, Rational brok2) { ned = brok1.getNed() * brok2.getNed(); over = brok1.getOver() * brok2.getOver(); red(); } void Rational::div(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getOver()); over = (brok1.getOver() * brok2.getNed()); red(); } //nyt Rational &operator+(int &left, Rational &right) { Rational tmp; tmp.over = (left * right.ned) + right.over; tmp.ned = right.ned; tmp.red(); return tmp; } Main filen. #include <iostream> using namespace std; #include "Brok.h" void main(void) { int o1,n1,o2,n2; cout << "Indtast forste broks taellerens : "; cin >> o1; cout << "Indtast forste Naevrens vaerdi : "; cin >> n1; cout << "Indtast forste broks taellerens : "; cin >> o2; cout << "Indtast forste Naevrens vaerdi : "; cin >> n2; Rational brok1(o1,n1); Rational brok2(o2,n2); Rational brok3; brok1.red(); cout << "brok1 = "<< brok1.getOver() << "/" << brok1.getNed() <<endl; brok2.red(); cout << "brok2 = "<< brok2.getOver() << "/" << brok2.getNed() <<endl; brok3.add(brok1,brok2); cout << "ADD = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; brok3.sub(brok1,brok2); cout << "SUB = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; brok3.mul(brok1,brok2); cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; brok3.div(brok1,brok2); cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; // nyt cout << endl << "brok1+2 = " << brok1+2 << endl; } Det er i den sidste linje som giver fejl...
Annonceindlæg fra Novataris
18. marts 2006 - 14:58
#1
hvilken fejl ?
18. marts 2006 - 16:41
#2
Jeg har besvaret spørgsmålet i et andet forum. + operatoren skal laves om til: friend Rational operator+ (int , Rational &); Der mangler en ostream << for rational Og man er nødt til at lave en midlertidig variabel for brok1+2 Man kunne løse det ved at lave en int constructor til Rational. main skal returnere en int.
18. marts 2006 - 17:24
#3
Ja tak så kan jeg godt bruge brok3 af type Rational Hvad skal man have ostream til???
18. marts 2006 - 18:05
#4
Du bliver nødt til at overloade din operator << (ostream) for at kunne anvende denne på Rational direkte men det synes jeg da heller ikke du har gjort nogen steder...
18. marts 2006 - 18:27
#5
cout er en ostream, for at kunne streame (<< ) en Rational skal compileren vide hvordan man udskriver en Rational, derfor en ostream << operator.
18. marts 2006 - 18:30
#6
Hvor gør han det i sin kode?
18. marts 2006 - 18:30
#7
Kan i komme med et e.x på hvordan man laver en ostream og forklare lidt måske.?
18. marts 2006 - 18:31
#8
Jeg skriver netop at der mangler en ostream << operator. I det andet forum har jeg postet en compilerbar kode med denne operator.
18. marts 2006 - 18:32
#9
mange tak
18. marts 2006 - 18:32
#10
friend ostream & operator<<( ostream& , const KlasseNavn & ); ostream & operator<<( ostream &coutRef , const KlasseNavn &KlasseNavnObjRef ) { coutRef << "(" << KlasseNavn.x << ", " << KlasseNavn.y << ")"; return coutRef; } f.eks
18. marts 2006 - 18:35
#11
hvad skal x og y
18. marts 2006 - 18:39
#12
hvad gør const KlasseNavn. hvad er klasseNavnObjRef til i dette her tilfælde. hvad er x og y til.
18. marts 2006 - 20:13
#13
x og y er vist mest et eksempel, i dit tilfælde ville det være over og ned. KlasseNavn er Rational i dit tilfælde. KlasseNavnObjRef er blot navnet på parametren.
18. marts 2006 - 20:35
#14
og hvad skal man bruge parametren til
18. marts 2006 - 20:41
#15
Denne udgave af ostream << operatoren er ikke en member af class'en, så parameteren er det object der skal udskrives.
18. marts 2006 - 20:41
#16
I dit tilfælde vi det se sådan her ud: ostream & operator<<( ostream &coutRef , const Rational &RationalObjRef ) { coutRef << "ned: " << getNed() << " over: " << getOver()<< endl; return coutRef; } f.eks
18. marts 2006 - 20:44
#17
Hov der var sq da en lille fejl i det der: ostream & operator<<( ostream &coutRef , const Rational &RationalObjRef ) { coutRef << "ned: " << RationalObjRef.getNed() << " over: " << RationalObjRef.getOver()<< endl; return coutRef; } I argument nummer 2 i din operator overloading modtager du en referance til noget af typen Rational som du kalde RationalObjRef. Det vil sige at det er RationalObjRef objektet du arbejder direkte på i din funktion!
18. marts 2006 - 20:47
#18
Du kan også vælge at overloade >> operatoren så at man f.eks kan gøre sådanne: cout << "Indtast din brøk, brøkken skal indtastet: nævner tæller " cin >> RationalObj;
18. marts 2006 - 20:48
#19
Noget helt andet: æ = \x91 Æ = \x92 ø = \x9B Ø = \x9D å = \x86 Å = \x8F
18. marts 2006 - 20:49
#20
?
18. marts 2006 - 20:50
#21
"koderne" for de danske karakterer hvis du ik lige kendte dem...
18. marts 2006 - 20:55
#22
okay dem kan jeg ikke bruge til så meget??
18. marts 2006 - 21:00
#23
Bare i dine cout til brugeren
18. marts 2006 - 21:01
#24
Men jeg poster lige noget kode om lidt du nok vil kunne få noget ud af
18. marts 2006 - 21:01
#25
okay
18. marts 2006 - 21:16
#26
Header fil RationalHead.h: #pragma once #include <iostream> using namespace std; class Rational { friend ostream & operator<<( ostream& , Rational & ); friend istream & operator>>( istream& , Rational & ); public: Rational(int = 0, int = 1); void red(void); int getOver(void); int getNed(void); void add(Rational, Rational); void sub(Rational, Rational); void mul(Rational, Rational); void div(Rational, Rational); Rational operator+(const Rational&); private: int over,ned; }; ----------------------------------------------------------------------------- Class fil RationalClass.cpp: #include "RationalHead.h" ostream & operator<<( ostream &coutRef , Rational &RationalObjRef ) { RationalObjRef.red(); coutRef << "Br\x9Bken: " << RationalObjRef.over << " / " << RationalObjRef.ned << endl; return coutRef; } istream & operator>>( istream &cinRef, Rational & RationalObjRef ) { int nedTemp,overTemp; cin >> nedTemp >> overTemp; RationalObjRef.ned = nedTemp; RationalObjRef.over = overTemp; return cinRef; } Rational::Rational(int o, int n) { if (n == 1) { n = 0; } over = o; ned = n; } int Rational::getNed() { return ned; } int Rational::getOver() { return over; } void Rational::red() { int taeller; for (taeller = 2; taeller <= over; taeller++) { while (over % taeller == 0 && ned % taeller == 0) { over = over / taeller; ned = ned / taeller; } } } void Rational::add(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getNed()); over = (brok1.getOver() * brok2.getNed()) + (brok2.getOver()* brok1.getNed()); red(); } void Rational::sub(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getNed()); over = (brok1.getOver() * brok2.getNed()) - (brok2.getOver()* brok1.getNed()); red(); } void Rational::mul(Rational brok1, Rational brok2) { ned = brok1.getNed() * brok2.getNed(); over = brok1.getOver() * brok2.getOver(); red(); } void Rational::div(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getOver()); over = (brok1.getOver() * brok2.getNed()); red(); } Rational Rational::operator+(const Rational &Pref) { Rational temp; temp.ned = ned + Pref.ned; temp.over = over + Pref.over; temp.red(); return temp; } ----------------------------------------------------------------------------- test fil test.cpp: #include "RationalHead.h" void main(void) { Rational brok1; Rational brok2; Rational brok3; cin >> brok1; cout << brok1; }
18. marts 2006 - 21:50
#27
istream & operator>>( istream &cinRef, Rational & RationalObjRef ) { int nedTemp,overTemp; cin >> nedTemp >> overTemp; RationalObjRef.ned = nedTemp; RationalObjRef.over = overTemp; return cinRef; } man kan ikke ikke tag de her privat data
18. marts 2006 - 22:09
#28
Jo det kan du da det er en friend funktion... Kommer den med den fejl?
18. marts 2006 - 22:09
#29
ja
18. marts 2006 - 22:11
#30
Hvordan ser din prototype ud?? og hvor erklære du den?
18. marts 2006 - 22:13
#31
#include <iostream> using namespace std; class Rational { friend Rational &operator+( Rational &, int &); friend Rational &operator-( Rational &, int &); friend Rational &operator*( Rational &, int &); friend Rational &operator/(Rational &, int &); friend Rational &operator==(Rational &, int &); friend Rational &operator!=(Rational &, int &); friend Rational &operator>(Rational &, int &); friend Rational &operator<(Rational &, int &); friend Rational &operator>=(Rational &, int &); friend Rational &operator<=(Rational &, int &); friend ostream &operator<<( ostream &, const Rational &); friend istream &operator>>(istream &, const Rational &); public: Rational(int = 0, int = 1); void red(void); int getOver(void); int getNed(void); void add(Rational, Rational); void sub(Rational, Rational); void mul(Rational, Rational); void div(Rational, Rational); private: int over,ned; };
18. marts 2006 - 22:13
#32
#include <iostream> using namespace std; #include "brok.h" Rational::Rational(int o, int n) { if (n == 1) { n = 0; } over = o; ned = n; } int Rational::getNed() { return ned; } int Rational::getOver() { return over; } void Rational::red() { int taeller; for (taeller = 2; taeller <= over; taeller++) { while (over % taeller == 0 && ned % taeller == 0) { over = over / taeller; ned = ned / taeller; } } } void Rational::add(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getNed()); over = (brok1.getOver() * brok2.getNed()) + (brok2.getOver()* brok1.getNed()); red(); } void Rational::sub(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getNed()); over = (brok1.getOver() * brok2.getNed()) - (brok2.getOver()* brok1.getNed()); red(); } void Rational::mul(Rational brok1, Rational brok2) { ned = brok1.getNed() * brok2.getNed(); over = brok1.getOver() * brok2.getOver(); red(); } void Rational::div(Rational brok1, Rational brok2) { ned = (brok1.getNed() * brok2.getOver()); over = (brok1.getOver() * brok2.getNed()); red(); } Rational &operator+(Rational &left, int &right) { static Rational tmp; tmp.over = (right * left.ned) + left.over; tmp.ned = left.ned; tmp.red(); return tmp; } Rational &operator-(Rational &left, int &right) { static Rational tmp; return tmp; } Rational &operator*(Rational &left, int &right) { static Rational tmp; return tmp; } Rational &operator/(Rational &left, int &right) { static Rational tmp; return tmp;} Rational &operator==(Rational &left, int &right) { static Rational tmp; return tmp; } Rational &operator!=(Rational &left, int &right) { static Rational tmp; return tmp;} Rational &operator>(Rational &left, int &right) { static Rational tmp; return tmp;} Rational &operator<(Rational &left, int &right) { static Rational tmp; return tmp;} Rational &operator>=(Rational &left, int &right) { static Rational tmp; return tmp; } Rational &operator<=(Rational &left, int &right) { static Rational tmp; return tmp;} ostream &operator<<(ostream &output, const Rational &udskriv) { output << "Br\x9Bken:" << udskriv.over << "/" << udskriv.ned; return output; } istream &operator>>(istream &input, Rational & indskrivning) { int nedTemp, overTemp; cin >> nedTemp >> overTemp; //indskrivning.ned = nedTemp; //indskrivning.over = overTemp; return input; }
18. marts 2006 - 22:13
#33
#include <iostream> using namespace std; #include "Brok.h" void main(void) { int o1,n1,o2,n2; cout << "Indtast forste broks taellerens : "; cin >> o1; cout << "Indtast forste Naevrens vaerdi : "; cin >> n1; cout << "Indtast forste broks taellerens : "; cin >> o2; cout << "Indtast forste Naevrens vaerdi : "; cin >> n2; Rational brok1(o1,n1); Rational brok2(o2,n2); Rational brok3; brok1.red(); cout << "brok1 = "<< brok1.getOver() << "/" << brok1.getNed() <<endl; brok2.red(); cout << "brok2 = "<< brok2.getOver() << "/" << brok2.getNed() <<endl; brok3.add(brok1,brok2); cout << "ADD = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; brok3.sub(brok1,brok2); cout << "SUB = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; brok3.mul(brok1,brok2); cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; brok3.div(brok1,brok2); cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl; // nyt cout << "____________------NEW------___________"; int test = 2; brok3 = brok1 + test; cout << brok3 << endl; int a = 2, b= 3; int i = (a > b) ? 0 : 1; cout << i; cout << "Br\x9Bken:"; }
18. marts 2006 - 22:15
#34
Oki nu er du da blevet helt crasy... men de fleste af dine overloading skal ikke erklæres som en friend funktion!
18. marts 2006 - 22:16
#35
Hvor får du din syntaks fra??
18. marts 2006 - 22:16
#36
Jeg er ved at lave en opgave hvor man skal gøre sådan
18. marts 2006 - 22:17
#37
syntaks
18. marts 2006 - 22:18
#38
jeg er hvis ved at være lidt træt af det her??
18. marts 2006 - 22:20
#39
Hehe kan jeg godt forstå... Men gør lidt klart hvad det er du vil så jeg ved hvad jeg skal svare på. Plus du kaster dig ud i meget når du laver så mange funktioner og vil have dem til at virke på en gang!!!
18. marts 2006 - 22:21
#40
jeg kan ikke få min istream til at virke, den laver fejl på at jeg kan ikke hente data fra privat i classen..
18. marts 2006 - 22:24
#41
Det er fordi du erklære den const!! friend istream &operator>>(istream &, const Rational &); dette gør jo at du ikke kan ændre i dens medlemsdata!!! Du ved godt betydningen af keyword'et const er ikke?? det skal være: friend istream &operator>>(istream &, Rational &);
18. marts 2006 - 22:25
#42
ja sidder bare og sover for hårdt det er klart når noget er const så kan man ikke ændre i den
18. marts 2006 - 22:29
#43
Jeps... standart bong fejl!! Virkede det så?
18. marts 2006 - 22:30
#44
ja total hvad laver du dagligt.
18. marts 2006 - 22:35
#45
Jeg læser til IKT ingeniør på Ingeniørhøjskolen i århus
18. marts 2006 - 22:37
#46
Jeg læser til IKT ingeniør på Ingeniørhøjskolen i århus
18. marts 2006 - 22:37
#47
okay jeg er ved at læse elektronik ingeniør og så skal jeg have sådan noget her.
18. marts 2006 - 22:38
#48
Hvor læser du??
18. marts 2006 - 22:39
#49
sønderborg sdu...
18. marts 2006 - 22:40
#50
Oki på IHA starter ELT og IKT sammen 1. semester så har også haft lidt EL hvor langt er du?
18. marts 2006 - 22:41
#51
For synes da at det er rimeligt oki PRG at have som ELT ingeniør
18. marts 2006 - 22:43
#52
jeg synes det er til grin, hvad kan en mikro controller lige klare Har du ikke en msn adr eller noget. det er træls det her
18. marts 2006 - 22:45
#53
skriv en mail til fiil @ dwankers . dk
Kurser inden for grundlæggende programmering