problem z przeciążeniem operatora >>

0

Mam problem tego typu:
Stworzyłem klasę LiczbaWymierna (ułamek zwykły) i przeciązyłem operator wyjscia (<<) tak żeby wyswieltal mi na ekranie liczbe w postaci "licznik/mianownik".
Teraz chciałbym zrobić tak, żeby wpisując np:

LiczbaWymierna x;
std::cin>>x;

a potem w konsoli "5/6"

mieć x.licznik=5 i x.mianownik=6

Próbowalem w ten (b.nieporadny sposob):
std::ostream&operator<<(std::ostream& wyjscie,LiczbaWymierna z)
{
wyjscie<<z.licznik_<<"/"<<z.mianownik_;
return wyjscie;
}

std::istream&operator>>(std::istream& wejscie,LiczbaWymierna &z)
{
std::string zobaczymy;
std::cin>>zobaczymy;
int i=0;
std::ostringstream napis1;
std::ostringstream napis2;
while(zobaczymy[i]!='/')
{
napis1<<zobaczymy[i];
i++;
}
std::string lancuch1=napis1.str();
lancuch1[i]=NULL;
i++;
std::string lancuch2;
for(i;i<zobaczymy.length();i++)
{
napis2<<zobaczymy[i];
}
lancuch2=napis2.str();

z.licznik_ = atoi(lancuch1.c_str());
z.mianownik_ = atoi(lancuch2.c_str());
wejscie>>zobaczymy;
return wejscie;
}

Wiem że gdzieś źle rozumuję, może dlatego że nie do końca ogarniam jak to wszystko dziala. Prosze o pomoc (może jakieś uwagi techniczne, sprostowanie?)
PS.Prosze o wyrozumialosc, to jest pierwszy moj post na tym forum.

0

za bardzo kombinujesz.

std::istream&operator>>(std::istream& wejscie,LiczbaWymierna &z)
{
     char ch;
     if (!wejscie >>z.licznik)
          return wejscie;
     if (wejscie.peek()=='/') {
          if (wejscie >> ch >> z.mianownik)
               return wejscie;
          else
               wejscie.clear();
     }
     z.mianownik = 1;
     return wejscie;
}
0
istream& operator>> (istream& strumien, liczba wymierna x)
{
    strumien >> x.licznik;
    char c;
    strumien >> c;
    strumien >> x.mianownik;

    return strumien;
}

EDIT: spóźniłem się ;]

0

Żadne z powyższych rozwiazan nie zalatwia sprawy.
Tzn,
kiedy mam:

LiczbaWymierna a;
cin>>a; (i tu po uruchomieniu programu wpisuje "2/3")

to a.licznik wcale nie rowna sie 2 (podobnie a.mianownik nie wynosi 3)

Zalezy mi na wpisywaniu tej liczby wlasnie w ten sposob (oddzielajac skladniki znakiem '/' a nie np spacją) bo w takiej postaci liczba jest wyswietlana gdy wpiszę;

LiczbaWymierna b;
cout<<b;

0
#include <iostream>

using namespace std;

class LiczbaWymierna
{
public:
	int licznik;
	int mianownik;
	LiczbaWymierna() : licznik(0), mianownik(0) {};
};

istream& operator>> (istream& strumien, LiczbaWymierna& x)
{
    strumien >> x.licznik;
    char c;
    strumien >> c;
    strumien >> x.mianownik;
 
    return strumien;
}

ostream& operator<< (ostream& strumien, LiczbaWymierna& x)
{
	strumien << x.licznik << "/" << x.mianownik;

	return strumien;
}

int main()
{
	LiczbaWymierna a;
	cin >> a;

	cout << "\n\nWynik = " << a << endl;

    system("pause");
    return 0;
}

Jak dla mnie działa jak należy

0

No zgadza sie, działa :)
Nie wiem co wczesniej bylo nie tak.
Dzięki :)

0

Ja wiem, nie miałeś konstruktora który inicjalizowal przy tworzeniu obiektu elementy klasy. Sprawdź bez listy inicjalizacyjnej konstruktora, nie powinno zadziałać ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1