# Skuska 27. 1. 2016

<{ForumPost(poster="Jankus", timestamp=2016-01-27 19:35:20)}>
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

    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?

    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...?)
<{/ForumPost}>

<{ForumPost(poster="jake", timestamp=2016-01-28 13:21:34)}>
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
<{/ForumPost}>

<{ForumPost(poster=":).", timestamp=2016-01-28 13:55:14)}>
U toho druhyho je spravne c a d, viz [http://en.cppreference.com/w/cpp/memory ... ake_unique](http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)
<{/ForumPost}>

<{ForumPost(poster="mmrmartin", timestamp=2016-01-28 23:57:43)}>

 > :). wrote:U toho druhyho je spravne c a d, viz [http://en.cppreference.com/w/cpp/memory ... ake_unique](http://en.cppreference.com/w/cpp/memory/unique_ptr/make_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...

    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.

    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
<{/ForumPost}>

