Przeciążenie wejścia dla obiektu klasy

0

Nie mogę wczytać danych do prywatnych składników klasy. W linijce , gdzie zamiescilem komentarz dochodzi do tego. Jak z tym sobie poradzić?

 class LiczbaZespolona {
private:
double re;
double im;
};


istream & operator >> ( istream & input, LiczbaZespolona & Z ){
		
		char nawias1,nawias2,i;
		input >> nawias1;
	    if(nawias1!='('){
		   input.unget(); 
		   input.setstate(ios::failbit);
		   return input;}
	    
		
		input>>Z.re>>Z.im;  // nie mam dostępu do tych danych 
		if(input.fail())
		   return input;
		input>>i;
		if(i!='i'){
		   input.unget(); 
		   input.setstate(ios::failbit);
		   return input;}
		
		input>>nawias2;
		if(nawias2!=')'){
		   input.unget(); 
		   input.setstate(ios::failbit);}
		   
return input;  }		
		

1

A skąd masz mieć dostęp? Przecież to prywatne składniki - o to w tym chodzi!

Masz dwa wyjścia. Dopisać deklarację przyjaźni tego operatora w klasie (czyli friend <deklaracja operatora>) albo dodać odpowiednie metody (akcesory) np. void setRe(double re);.

0

http://ideone.com/4MUU9H

class A
{
public:
    friend istream& operator>>(istream&, A&);
    friend ostream& operator<<(ostream&, const A&);
 
private:
    int x;
};
 
istream& operator>>(istream& i, A& a)
{
    return i >> a.x;
}
 
ostream& operator<<(ostream& o, const A& a)
{
    return o << a.x;
}

Niestety operatory strumieni nie moga sie znalezc jako skladowe klasy, wiec musimy uzyc drobnej kombinacji z deklaracja przyjazni. Kopiujemy naglowek funkcji operatora do klasy i wstawiamy przed nim slowko "friend" "f-r-i-e-n-d". Pozwala to operatorowi na korzystanie ze skladowych prywatnych danej klasy. Co wiecej mozna zrobic jeszcze jeden podobny hack z dodaniem publicznej metody realizujacej dzialanie operatora i w samym operatorze wywolac po prostu ta metode. Tworca niestety tego jakze pieknego jezyka postanowil stworzyc przeciazanie kazdego operatora w inny sposob. Co wiecej deklaracja przyjazni nie sprawia, ze funkcja czy klasa (bo jak sie zapewne dowiesz, ktoregos pieknego dnia, mozna tez uzywac slowa kluczowego "friend" dla innych klas) staje sie "skladowa" (uwaga, tutaj uzyto troche zargonu, znaczy to, ze dany obiekt nie sklada sie na klase (jest oddzielnym bytem)). Moze Ci to troche utrudnic sprawe, ale warto to naprawde zapamietac, poniewaz kiedys jak poznasz juz szablony, bedziesz mial znowu problem z tymi operatorami. To chyba bylo na tyle, jak jeszcze nie zrozumiales drogi autorze tych 6 linijek kodu, zachecam do zadawania pytan, z checia napisze kolejne wypracowanie na ten temat, ktore osobiscie uwazam, ze jest bezsensowne, ale dla niektorych post bez nich jest postem straconym. Zycze oczywiscie milego dnia! :)

2

Dla klasy implementującej liczby zespolone nie ma żadnego sensu prywatność składowych im oraz re.
Prywatność składowych istnieje po to aby zapewnić spójność danych czyli zapobiec ewidentnym bzdurą np dla daty 35.05.2013 lub 30.02.2013
Dla liczby zespolonej każda para liczb rzeczywistych stanowi poprawną liczbę zespoloną.

1

Dla klasy implementującej liczby zespolone nie ma żadnego sensu (...)

Sensu nie ma przede wszystkim pisanie takiej kasy. Taka już jest w bibliotece standardowej i nazywa się std::complex.

Edit: a propos minusów i komentarzy. Wystarczy pisać rzeczy mniej oklepane i bardziej rozwojowe. Po co pisać coś, czego nie ma sensu użytkować. Świetna nauka - przepisać bibliotekę standardową. W innych językach, w których biblioteka jest nieporównywalnie większa (np. C#) nikt nawet o tym nie pomyśli - tam się uczy jak korzystać z tej biblioteki bo to część języka! C++ jest nauczane w bezsensowny, przestarzały sposób zamiast tak, jak inne nowoczesne języki. Takie nauczanie jest oczywiście tutaj promowane - nieczytelne kody, brzydkie hacki (których sam autor czasem nie rozumie), pisanie wszystkiego samemu i od nowa bo to przecież nauka. I po co taka nauka po której zna się niewiele więcej niż C w C++?

1

pomijając fakt, że taka klasa już jest, to uważam, że twory czysto matematyczne (jak liczba zespolona) powinny mieć pola publiczne, bez żadnego kombinowania.

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