ostream & print()

0

Mógłby mi ktoś zaprezentować przykładową implementację takiej funkcji: ostream & print();
Zwracana jest referencja do strumienia na ekran, jak to zaimplementować ?, co wpisać obok return ?

0

A to nie miała czasem być funkcja

ostream& print(ostream& strumien)
{
strumien<< this->jakieśtamskładowe;
return strumien;
}

Albo w ogóle co ładniej wygląda, bo wystarczy ci pisać np.
Klasa obiekt;
cout<< obiekt;

friend ostream& operator<<(ostream & strumien, Klasa& zmienna)
{
strumien<<zmienna.skladowe;
return strumien;
}
0

Shalom, to się robi zwykle w ten sposób:

struct foo
{
  ostream& print(ostream& os) const
  {
    os << cośtam;
    return os;
  }
  //bla bla bla
};
ostream& operator<<(ostream& os, const foo& obj)
{
  return obj.print(os);
}
0

manfred, chyba jednak łatwiej i krócej jest:

struct foo {
 //...

 friend ostream& operator << ( ostream&, const foo& );
}

ostream& operator<<(ostream& os, const foo& obj)
{
  os << obj.elem_skladowy;
 //...
 return os;
}
0

I brzydziej, należy unikać friendów tam, gdzie się da.

0

a to niby czemu?? mamy sobie utrudniać bez powodu życie??

0

I brzydziej, należy unikać friendów tam, gdzie się da.

E, no właśnie, dlaczego? Zwłaszcza czy przeładowywaniu operatorów to bez sensu! W ogólnym przypadku musiałbyś udostępniać publiczną metodę pośrednią:

class A {
   /*...*/
   public:
   void print_me(ostream& out);
};
void operator<<(ostream& out, A&& value) { return value.print_me(out); }

bezsensowne :|

0

Ja tam nie wiem, sugeruję się Herbem Sutterem... http://www.gotw.ca/gotw/004.htm ma krótko napisane, że operator<< nie powinien być friendem... Hm, można wiedzieć, cóż to za radosny język ma referencje do referencji (rval-ref z C++0x nie liczę. ten język póki co nie istnieje)?

0
Ranides napisał(a)

I brzydziej, należy unikać friendów tam, gdzie się da.

E, no właśnie, dlaczego? Zwłaszcza czy przeładowywaniu operatorów to bez sensu! W ogólnym przypadku musiałbyś udostępniać publiczną metodę pośrednią:

class A {
   /*...*/
   public:
   void print_me(ostream& out);
};
void operator<<(ostream& out, A&& value) { return value.print_me(out); }

bezsensowne :|

niby tak, ale nie jednak nie..
generalnie, rowniez moim zdaniem, tak wlasnie powinno byc! przeciazanie operatorow jako jedynie smaczek syntaktyczny, wszystkie operacje powinny byc dostepne takze w normalny sposob, pozostawiajac wybor pomiedzy pisaniem uber-zwięzłym a rozwleklym dla mniej-oblatanych

zreszta, czemu operator wsuwu do strumienia mialby korzystac z wewnetrznych bebechow klasy? w czym ma on wiecej praw od zwyklego klienta klasy, ktory np. chcialby ja recznie zserializowac do pliku tekstowego? IMHO, operator<< jest tylko klientem..

0

jak zwykle w takich przypadkach lubię patrzeć na bibliotekę std. Nigdzie nie znalazłem metod publicznych:

string::put_to_stream(ostream&)
string::get_from_stream(istream&)

a operatory << oraz >> i owszem, są. I to friendowe.

Zależy od punktu widzenia. Dla mnie operator xxx, to metoda obiektu, tylko woła się ją inaczej. Operatory w ogóle powinny być składowymi, ale z powodów tylko składniowych << >> być nie mogą (ostream,istream po lewej stronie mile widziany).

Oczywiście, to takie jakieś se dyskusje w stylu bożego narodzenia.

Ale po prostu nie lubię, kiedy się odradza jakąś technikę tylko dlatego, że jest z jakimś tam paradygmatem, albo widzi-mi-się autora niezgodna. Zwłaszcza, gdy odrzucenie techniki powoduje rozrost kodu źródłowego, narzut run-time (kolejny call), a w zamian nie daje żadnego wzrostu wydajności, bezpieczeństwa czy czegokolwiek innego oprócz tego, że teraz jest zgodna z czyjąś wizją ideologiczną.

0

true, true..

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