udvidet spørgsmål til lommeregner

Tags:    c++

<< < 12 > >>
hej igen

det her spørgsmål er bare en opfølgning på lommeregnerspørgsmålet stillet tidligere. som nævnt tidligere har jeg puttet de forskellige operatorer ind i hver deres klasse. lommeregneren kan så ved hjælp af objekter af typen Num regne den nye værdi ud. jeg får nu til opgave at regne følgende udtryk ud 2/(3+4). regnestykket 3+4 regner jeg ud ved hjælp af min plus klasse som ser således ud:

class BinOp
{
class Plus
{
public:

*Plus(Num* num1,Num* num2):value(num1->eval()+num2->eval())
{

}
double Get() {return value;}

private:
double value;
};
};
i main kommer det så til at se således ud:

Num num2(2);
Num num3(3);
Num num4(4);

BinOp::Plus plus3_4(&num3,&num4);

problemet opstår når jeg skal dividere udtrykket. der skal jeg i main have et udtryk der ser således ud:

BinOp::Div div2_7(&num2,&plus3_4);

problemet er bare plus3_4 er ikke af typen Num, men af plus, så jeg får følgende compile error:

no matching function for call to `BinOp::Div::Div(Num*, BinOp::Plus*)'

candidates are: BinOp::Div::Div(Num*, Num*)

indtil videre har jeg ikke kunne finde en løsning på problemet. jeg har prøvet om kan kunne kaste en if sætning , men har ikke haft held med det. hvis der er nogen der har et forslag til hvordan man få klassen til at regne med nummerværdier (Num) og operator værdier (Plus,Minus,gange og dividere), vil jeg meget gerne høre det.

hilsen james



PS

beklager smileyerne



du kan indsætte [code]din kode her[/code*] så bliver teksten uden smileys

husk at fjerne * dog



her er koden uden smileyer:

[/code
class BinOp
{
class Plus
{
public:

*Plus(Num* num1,Num* num2):value(num1->eval()+num2->eval())
{

}
double Get() {return value;}

private:
double value;
};
};

i main kommer det så til at se således ud:

Num num2(2);
Num num3(3);
Num num4(4);

BinOp::Plus plus3_4(&num3,&num4);

problemet opstår når jeg skal dividere udtrykket. der skal jeg i main have et udtryk der ser således ud:

BinOp::Div div2_7(&num2,&plus3_4);

problemet er bare plus3_4 er ikke af typen Num, men af plus, så jeg får følgende compile error:

no matching function for call to `BinOp::Div::Div(Num*, BinOp::Plus*)'

candidates are: BinOp::Div::Div(Num*, Num*)

]

indtil videre har jeg ikke kunne finde en løsning på problemet. jeg har prøvet om kan kunne kaste en if sætning , men har ikke haft held med det. hvis der er nogen der har et forslag til hvordan man få klassen til at regne med nummerværdier (Num) og operator værdier (Plus,Minus,gange og dividere), vil jeg meget gerne høre det.

hilsen james



prøver igen

[code][/code class BinOp
{
class Plus
{
public:

*Plus(Num* num1,Num* num2):value(num1->eval()+num2->eval())
{

}
double Get() {return value;}

private:
double value;
};
};

i main kommer det så til at se således ud:

Num num2(2);
Num num3(3);
Num num4(4);

BinOp::Plus plus3_4(&num3,&num4);

problemet opstår når jeg skal dividere udtrykket. der skal jeg i main have et udtryk der ser således ud:

BinOp::Div div2_7(&num2,&plus3_4);

problemet er bare plus3_4 er ikke af typen Num, men af plus, så jeg får følgende compile error:

no matching function for call to `BinOp::Div::Div(Num*, BinOp::Plus*)'

candidates are: BinOp::Div::Div(Num*, Num*) ]




Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 02.05.2008 13:10 af Bruger #11386
en gang til

Fold kodeboks ind/udKode 


indtil videre har jeg ikke kunne finde en løsning på problemet. jeg har prøvet om kan kunne kaste en if sætning , men har ikke haft held med det. hvis der er nogen der har et forslag til hvordan man få klassen til at regne med nummerværdier (Num) og operator værdier (Plus,Minus,gange og dividere), vil jeg meget gerne høre det.

hilsen james




beklager, men jeg kan ikke fjerne smileyerne



for at springe smileyerne over. så leder jeg stadigvæk efter en måde hvor jeg kan få min klasse Div (dividere) til at regne med typen Num (nummer) og operatorer (Plus)



Du skal lade dine BinOp:: class'er arve fra Expr:
Fold kodeboks ind/udKode 

Bemærk at argumenterne til Plus contructoren nu er Expr* ikke Num* og at Get er lave om til eval.

(Du kan undgå smileys ved at indsætte et mellemrum efter :)



Du skal lade dine BinOp:: class'er arve fra Expr:
Fold kodeboks ind/udKode 

Bemærk at argumenterne til Plus contructoren nu er Expr* ikke Num* og at Get er lave om til eval.

(Du kan undgå smileys ved at indsætte et mellemrum efter :)


hej Bertel. igen, tak for din besvarelse. jeg har prøvet at implementere din kode og den fungere som den skal. der opstår nu et andet problem. nu skal jeg include funktionen:

virtual string tostring();

som er en del af <sstream> biblioteket. den skal kaldes ved udtrykket og returnere formlen. det er så meningen, at de værdier der er i lommeregneren, skal konverteres til string. følgende eksempel er givet:

#include <sstream>
...
std:: stringstream stream;
stream << some_val; // like cout
stream.str(); // output a string

problemet er bare at Num klassen og alle klasserne i BinOp, har arvet af Expr. så når jeg kompiler kan de forskellige variabler ikke erklæres, fordi tostring() funkionen er abstrakt. sådan som jeg har forstået problemet, så skal tostring() funktionen erklæres igen i alle de klasser som arver af Expr, hvor dens funktion så er at returnere værdierne som string, men jeg er ikke sikker, så jeg kunne godt bruge lidt hjælp.



<< < 12 > >>
t