[ Dovla84 @ 25.10.2011. 01:47 ] @
Imam metodu klase koja treba da vrati objekat po referenci i izgleda od prilike ovako:

Code:
Configuration& ConfigurationManager (vector<string>&v)
{
    boost::shared_ptr<Configuration> config (new Configuration());
    ......              //ovaj deo nije bitan jer se vrse neke bazicne operacije
    return *config;
}



Zanima me da li je return *config; validno napisati i sta ce vratiti sobzirom da se radi o shared_ptr pointeru (tek ucim kako funkcionisu smart pointeri)? Ako nije u redu, kako da vratim Configuration& ?
[ Dragi Tata @ 26.10.2011. 03:47 ] @
Ne možeš da vratiš Configuration& jer će to biti referenca na lokalni objekat koji je uništen na kraju funkcije. Ako hoćeš da koristiš shared_ptr (koji je sad i deo standarda, pa ne moraš više da uključuješ Boost) onda napišeš nešto ovako:

Code:

shared_ptr<Configuration> ConfigurationManager (vector<string>&v)
{
    shared_ptr<Configuration> config (new Configuration());
    ......              //ovaj deo nije bitan jer se vrse neke bazicne operacije
    return config;
}


a ja najviše volim ovako:

Code:

Configuration ConfigurationManager (vector<string>&v)
{
    Configuration config;
    ......              //ovaj deo nije bitan jer se vrse neke bazicne operacije
    return config;
}
[ Goran Arandjelovic @ 27.10.2011. 13:16 ] @
Ja bih samo malo da pojasnim šta je Dragi Tata hteo da kaže ovim drugim primerom, da ne dođe do zabune. :)
Naime, u drugom primeru (doduše, u zavisnosti od kompajlera i uključenih optimizacija) će se desiti copy ellision i pozivanje move konstruktora nakon dodele takve povratne vrednosti nekom novom objektu (naravno, samo u slučaju ako je move konstruktor definisan unutar klase Configuration, u ovom primeru)
[ Dovla84 @ 27.10.2011. 15:39 ] @
Ok. Kapiram. Moram da pazim na scope. Hvala.