Skuska 27. 1. 2016

Odeslat odpověď

Smajlíci
:D :) :( :o :shock: :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode je zapnutý
[img] je zapnutý
[flash] je vypnutý
[url] je zapnuté
Smajlíci jsou zapnutí

Přehled tématu
   

Rozšířit náhled Přehled tématu: Skuska 27. 1. 2016

Re: Skuska 27. 1. 2016

od mmrmartin » 28. 1. 2016 23:57

:). píše:U toho druhyho je spravne c a d, viz http://en.cppreference.com/w/cpp/memory ... ake_unique
Taky si myslím, make_unique<T>(par) předá parametry do kostruktoru T, takže v případě toho c) se vlastně volá copy konstruktor - vytvoří se stejný objekt jinde v paměti...

Kód: Vybrat vše

std::unique_ptr<T> p = std::make_unique<T>(params) == std::unique_ptr<T> p(new T(params)) 

Mě ještě zaujala otázka:
Máme objekt Zvire, Pes: Zvire a Kocka: Zvire. Jak uložit do paměti objekty typů Pes a Kocka.

Kód: Vybrat vše

a) vector<Zvire *> z;
b) vector<Zvire &> z;
c) pair<vector<Kocka>, Pes> z;
d) vector<Zvire> z;
Správně pouze a)
b) nevlastní data v paměti a po opuštění scopu může ukazatel ukazovat do prázdna (v nejlepším případě); c) hloupost; d) nezachovává dědičnost

Re: Skuska 27. 1. 2016

od :). » 28. 1. 2016 13:55

U toho druhyho je spravne c a d, viz http://en.cppreference.com/w/cpp/memory ... ake_unique

Re: Skuska 27. 1. 2016

od jake » 28. 1. 2016 13:21

I. mas vektor Base instanci (!), kazda zabere treba 4 B, odvozeny Rectangle ma mozna data navic - celkem zabere treba 12 B ... jak chces do vektoru, kde jsou prihradky o velikosti 4 B davat instance o velikost 12 B ? je to nesmysl, kdybys to udelal, doslo by k tzv. "slicingu"

II.
a) b je reference na const, nelze volat modifikujici move
b) to muzes, presunes vlastnictvi dynamickeho objektu z a do noveho pointeru, ktery se nasledne presune do navratove hodnoty
c) nesmysl *b neni pointer, tak jej nemuzes ulozit do unique_ptr
d) ziskas r-value referenci na a a tim presunes dynamicky objekt z a do navratove hodnoty

Skuska 27. 1. 2016

od Jankus » 27. 1. 2016 19:35

Otazky rovnake ako vzdycky, dve veci som nevedel:

ta otazka s Rectanglom uz tu bola minule, ale trochu ina (tam sa do vektoru ukladali pointre, tu priamo hodnota):
Mame triedu Base a jej potomka Rectangle. potom vector
std::vector<Base> a;
a ze akym prikazom donho dostaneme nejaky objekt typu Rectangle

Kód: Vybrat vše

a) { Rectangle r; a.push_back(&r); }
b) Do tohoto vektoru nemozeme priradit objekt typu Rectangle.
c) a.push_back( * new Rectangle );
d) a.push_back( Rectangle() );
Spravna odpoved bola b), ze to to nejde.

tiez podobna ako minule na unique pointre:
std::unique_ptr<T> f (std::unique_ptr<T> a, const std::unique_ptr<T>& b) {
}
Co moze byt v tele f?

Kód: Vybrat vše

a) return std::move(b);
b) return std::make_unique<T>(a);
c) return std::make_unique<T>(*b);
d) return std::move(a);
Spravne su b) a d)

(v obidvoch veciach si nie som uplne isty, preco to tak je...?)

Nahoru