[ karas @ 13.09.2004. 13:45 ] @
| Sledecci kod
Code:
#include <iostream>
using namespace std;
class A
{
string s;
public:
A(void) { }
A(const string& str) : s(str) { }
A(const A& a) : s(a.s) { }
~A(void) { }
ostream& operator<<(ostream& os) { os << s; return os; }
};
int main(void)
{
A a("Hello, World!\n");
cout << a;
}
ne mozze da se prevede, ali ako se operator<< napishe kao prijateljska funkcija, onda prethodni kod radi.
Takodje, ako se u main() umesto cout << a; stavi a.operator<<(cout), onda prethodni kod radi.
Zashto? |
[ sspasic @ 13.09.2004. 14:04 ] @
Code:
ostream& operator<<(ostream& os) { os << s; return os; }
u stvari preklapa:
Code:
a << cout;
To što želiš možeš da postigneš samo funkcijom koja nije članica klase.
[ Dragi Tata @ 13.09.2004. 14:17 ] @
Upravo tako.
Code:
operator <<
je ili član klase ostream ili slobodna funkcija.
Uzgred, zašto si pisao svoj konstruktor za kopiranje i destruktor koji ne radi ništa? Mislim na ovaj deo:
Code:
A(const A& a) : s(a.s) { }
~A(void) { }
[ karas @ 13.09.2004. 15:48 ] @
Zashto << ne mozze da bude chlanica klase? Mogu +, -, itd. ne vidim zashto je << poseban.
Ovde sam bezveze stavio konstruktore i destruktor, a inache ih uvek stavljam (i operator=) chak i kad su prazni, tek da ne pustim da prevodilac radi po svome.
[ Reljam @ 13.09.2004. 15:52 ] @
Nije << specijalan, nego operatori koji su memberi moraju da vrate referencu na svoj tip. Znaci << treba da vrati A&, a ne ostream&.
[ Dragi Tata @ 13.09.2004. 16:19 ] @
Citat:
karas: Ovde sam bezveze stavio konstruktore i destruktor, a inache ih uvek stavljam (i operator=) chak i kad su prazni, tek da ne pustim da prevodilac radi po svome.
Zanimljivo je da sam naletao na takve savete kad sam učio C++ pre skoro 10 godina. Verovatno su tad kompajleri bili lošiji. Danas je filozofija drugačija: ako će kompajler nešto da odradi za tebe, pusti ga - u 99% slučajeva će to da uradi bolje nego ti ili bar isto.
[ karas @ 13.09.2004. 17:08 ] @
Jasno, hvala na savetima.
[ sspasic @ 13.09.2004. 17:57 ] @
Citat:
Zashto << ne mozze da bude chlanica klase?
Pazi, kada preklopiš operator u klasi A a argument je tipa B ti si preklopio A op B.
Tebi je u cout << a sa leve strane objekat klase koju ne bi trebalo da menjaš.
Kada možeš da menjaš klasu sa leve strane onda možeš da koristiš funkcije članice.
[ Djuki @ 18.09.2004. 16:52 ] @
Koliko ja znam preklapanje opertatora << i >> se mora raditi sa friend funkcijama, zar ne ?
[ sspasic @ 18.09.2004. 17:10 ] @
Ne mora.
Ako ti je potreban pristup članovima klase koji nisu public - koristiš friend.
Ovo važi kako za funkcije tako i za operatore.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.