Page 1 of 1

ostream operator

Posted: 11 Apr 2013, 10:30
by Mihail
Va salut.Am si eu o nelamurire: de ce acest operator TREBUIE sa returneze o adresa? Ar trebui sa fie optional acest lucru (e stiut faptul ca returnarea prin adresa e mai rapid) dar aici vad ca e o obligatie impusa de compilator.

Code: Select all

class A
{
int i;
public:
	 A(){ }
	 A(int t){i = t;}

	 friend ostream /* & */ operator <<(ostream &os, A a)
	 {
		 os<<a.i;
		 return os;
	 }
};

Re: ostream operator

Posted: 11 Apr 2013, 12:49
by Marius Bancila
Operatorii care creeaza o noua valoare (sau obiect), returneaza obiectul prin valoare. Operatorii care modifica o valoare (sau obiect) existenta, returneaza obiectul prin referinta. Cam asta ar fi regula.

Re: ostream operator

Posted: 11 Apr 2013, 13:38
by Ovidiu Cucu
Iti da eroare nu pentru ca "acest operator TREBUIE sa returneze o adresa" (mai bine zis referinta), si nici pentru ca "e o obligatie impusa de compilator" ci din modul de implementare a claselor pentru streams.
Intr-o clasa de baza (basic_ios) constructorul de copiere si operatorul de atribuire sunt declarate private.
Poti obtine aceasi eroare in orice functie daca intorci prin valoare sau pasezi prin valoare un obiect de tip derivat din basic_ios.
Exemplu:

Code: Select all

ofstream foo(ofstream& out)
{
   // ...
   return out; // return by value
}

void bar(ofstream out) // pass by value
{
   // ...
}

int main()
{
   ofstream out("aaa");
   ofstream out2("bbb");
   out2 = foo(out);
   bar(out);
}
De ce asta?
Pentru ca, pentru obiecte de tip derivat din basic_ios si specializarile lor, incluzand ostream, copierea nu numai ca n-are sens insa poate fi o sursa be bug-uri. Gandeste-te doar ca obiecte de acest tip tin un handle de fisier. Daca fac o copie, voi avea doua obiecte care tin acelasi handle. Sa zicem ca unul dintre obiecte este distrus iar handle-ul respectiv este inchis. Celalalt ("clona") nu. Mai departe, daca folosesc obiectul "clona", folosesc un handle deja inchis deci... "Zbang!".

Re: ostream operator

Posted: 11 Apr 2013, 14:41
by Mihail
Intr-o clasa de baza (basic_ios) constructorul de copiere si operatorul de atribuire sunt declarate private.
Gata, totul capata sens.M-am uitat prin clasele de baza dar...degeaba.Daca-mi pica la vreun interviu asemenea minuni ma apuc de Java.In Java pot sa programeze si aia mai prosti oleaca...

Thx Ovidiu.

Re: ostream operator

Posted: 11 Apr 2013, 17:39
by Ovidiu Cucu
Mihail wrote:
Intr-o clasa de baza (basic_ios) constructorul de copiere si operatorul de atribuire sunt declarate private.
Gata, totul capata sens.M-am uitat prin clasele de baza dar...degeaba.Daca-mi pica la vreun interviu asemenea minuni ma apuc de Java.In Java pot sa programeze si aia mai prosti oleaca...

Thx Ovidiu.
Nu are rost sa treci pe Java pentru atata lucru. :)
Nu, Java nu-i pentru prosti, ci doar pentru un alt segment de programatori. :D
Nu cred ca cineva cu scaun la cap, la un interviu de C++, ti-ar da o asemenea problema fara sa specifice concret si care sunt erorile de compilare, asa cum ai facut tu in OP. ;)

Re: ostream operator

Posted: 12 Apr 2013, 10:58
by Marius Bancila
Mihail wrote:
Intr-o clasa de baza (basic_ios) constructorul de copiere si operatorul de atribuire sunt declarate private.
Gata, totul capata sens.M-am uitat prin clasele de baza dar...degeaba.Daca-mi pica la vreun interviu asemenea minuni ma apuc de Java.In Java pot sa programeze si aia mai prosti oleaca...

Thx Ovidiu.
De ce te dai batut la primele probleme? Crezi ca in Java sau .NET nu vei intalnii probleme? Ce faci, dai si de acolo bir cu fugitii?

Re: ostream operator

Posted: 12 Apr 2013, 12:00
by Ovidiu Cucu
Marius Bancila wrote: De ce te dai batut la primele probleme? Crezi ca in Java sau .NET nu vei intalnii probleme? Ce faci, dai si de acolo bir cu fugitii?
Se lasa de programare si se face architect. :biggrin:

Re: ostream operator

Posted: 12 Apr 2013, 18:13
by Mihail
De ce te dai batut la primele probleme? Crezi ca in Java sau .NET nu vei intalnii probleme? Ce faci, dai si de acolo bir cu fugitii?
Ei, n-am ajuns chiar asa :biggrin: ,C++ e limbajul care-l stapanesc (totusi) cel mai bine, chiar daca ma mai impiedic.Lucrez deja la job cu el.Un lucru destul de enervant e ca ajung uneori sa cred ca-l stiu la perfectie si dintr-odata aflu ca mai este cite-o chichita pe care n-o stiam... si de fiecare data cind patesc asta, parca primesc o palma, pentru ca defapt nu-l stiu asa cum credeam.

Ovidiu:
Se lasa de programare si se face architect. :biggrin:
Razi tu razi Harap-Alb, dar cunosc doua cazuri concrete (inca in Iasi la noi) in care din cauza ca erau incompetenti la development i-au facut, ghici ce? Software Development Manager :thumbsup: Ce-i drept amandoi aveau o calitate comuna: stapaneau taina susotirii pe la colturi, in ceas de seara...

Re: ostream operator

Posted: 12 Apr 2013, 19:10
by Ovidiu Cucu
Ca tot am luat-o pe langa topic... :)
Mihail wrote:Un lucru destul de enervant e ca ajung uneori sa cred ca-l stiu la perfectie si dintr-odata aflu ca mai este cite-o chichita pe care n-o stiam...
...iar atunci cand crezi ca stii toate chichitele, jbangg!... apare C++11 cu chichite noi. :biggrin:
Mihail wrote: Ovidiu:
Se lasa de programare si se face architect. :biggrin:
Razi tu razi Harap-Alb, dar cunosc doua cazuri concrete (inca in Iasi la noi) in care din cauza ca erau incompetenti la development i-au facut, ghici ce? Software Development Manager :thumbsup: [...]
Asta nu-i nimic. Sa fii Software Development Manager nu trebuie neaparat sa fii si guru la programare. Mai rau e cand un idiot ajunge Software Architect. Daca mai e si fan GoF, iese o ninune de proiect cum n-a vazut nici darcu, nici ma-sa sa-l chieptene... :biggrin:

Re: ostream operator

Posted: 12 Apr 2013, 22:35
by Mihail
...iar atunci cand crezi ca stii toate chichitele, jbangg!... apare C++11 cu chichite noi. :biggrin:
Apai atit timp cit lucrez doar cu VS2008, si inca voi lucra mult timp, n-au decit sa apar un milion de versiuni de C++.
Asta nu-i nimic. Sa fii Software Development Manager nu trebuie neaparat sa fii si guru la programare.
Corect in general, desi am vazut un caz in care coda cot la cot cu developerii.
Mai rau e cand un idiot ajunge Software Architect. Daca mai e si fan GoF, iese o ninune de proiect cum n-a vazut nici darcu, nici ma-sa sa-l chieptene... :biggrin:
Si de astea am vazut, s-a intimplat o treaba de asta cind boss-ii din US care se ocupau printre altele si de numirea arhitectului, se opreau direct in cluburile de fetite cind veneau la noi, drept dovada unul din ei s-a si insurat cu o ieseanca pentru care banii nu conteaza :yes:
Ma opresc aici, ca deja am inceput sa scriu subiecte de scandal.