PDA

Visualizza la versione completa : [C++] Overloading e problema di accesso ai campi privati


ramy89
26-01-2012, 00:53
Sto progettando una classe Fraction, che deve contenere un numero in formato frazionario.
Per ora gli ho fatto il calpo value che un double, ma ho provato a fare l' overloading dell' operatore >> per prendere un valore in input:


#include <iostream>

using namespace std;

class Fraction
{
public:
Fraction();
Fraction(double value);
Fraction(float value);
Fraction(int value);
void set(double value);
void set(float value);
void set(int value);
double value;
};


Fraction::Fraction()
{
value=0.0;
}


Fraction::Fraction(double value)
{
this->value=value;
}

Fraction::Fraction(float value)
{
this->value=(double)value;
}

Fraction::Fraction(int value)
{
this->value=(double)value;
}

void Fraction::set(double value)
{
this->value=value;
}

void Fraction::set(float value)
{
this->value=(double)value;
}

void Fraction::set(int value)
{
this->value=(double)value;
}

istream &operator>> (istream &input, Fraction *f)
{
input >> f->value;
return input;
}

int main(int argc, char **argv)
{
Fraction *f;
f=new Fraction(4.5);
cin>>f;
cout<<f->value<<endl;
return 0;
}




istream &operator>> (istream &input, Fraction *f)
{
input >> f->value;
return input;
}


Ma il problema proprio quando vado a fare l' overloding: il campo l' ho messo pubblico perch altrimenti mi dice che non pu accedere a un campo privato.
Mi chiedo se non c' un modo di scavalcare questa cosa, come hanno fatto ad esempio con la classe string.Sapete come fare?

MItaly
26-01-2012, 00:59
Dovresti dichiarare l'operatore come friend della classe.


class Fraction
{
friend istream &operator>> (istream &input, Fraction *f);
...
};

Comunque, se devi memorizzare una frazione in linea di massima non la memorizzerai come un double, ma come coppia di interi numeratore-denominatore.

Loading