ostream operator

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
Mihail
Junior
Junior
Posts: 15
Joined: 11 Apr 2013, 10:14

ostream operator

Post by Mihail » 11 Apr 2013, 10:30

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;
	 }
};



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: ostream operator

Post by Marius Bancila » 11 Apr 2013, 12:49

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.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: ostream operator

Post by Ovidiu Cucu » 11 Apr 2013, 13:38

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!".

Mihail
Junior
Junior
Posts: 15
Joined: 11 Apr 2013, 10:14

Re: ostream operator

Post by Mihail » 11 Apr 2013, 14:41

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: ostream operator

Post by Ovidiu Cucu » 11 Apr 2013, 17:39

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. ;)

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: ostream operator

Post by Marius Bancila » 12 Apr 2013, 10:58

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?
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: ostream operator

Post by Ovidiu Cucu » 12 Apr 2013, 12:00

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:

Mihail
Junior
Junior
Posts: 15
Joined: 11 Apr 2013, 10:14

Re: ostream operator

Post by Mihail » 12 Apr 2013, 18:13

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...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: ostream operator

Post by Ovidiu Cucu » 12 Apr 2013, 19:10

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:

Mihail
Junior
Junior
Posts: 15
Joined: 11 Apr 2013, 10:14

Re: ostream operator

Post by Mihail » 12 Apr 2013, 22:35

...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.

Post Reply