Skuska 27. 1. 2016

Základní kurs objektově orientovaného programování v C++. Třídy a objekty, zapouzdření, metody, plymorfismus. Abstraktní datové typy, přetěžování. Kontejnery, iterátory, algoritmy. Šablony, generické programování, kompilační polymorfismus. Výjimky. Bezpečné a přenositelné programování, vazby na OS.
Jankus

Skuska 27. 1. 2016

Příspěvek od Jankus »

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...?)
jake

Re: Skuska 27. 1. 2016

Příspěvek od jake »

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
mmrmartin
Matfyz(ák|ačka) level I
Příspěvky: 19
Registrován: 3. 6. 2015 21:55
Typ studia: Informatika Bc.
Bydliště: Kajka / Jihlava

Re: Skuska 27. 1. 2016

Příspěvek od mmrmartin »

:). 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
Odpovědět

Zpět na „NPRG041 Programování v C++“