• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

std::unique_ptr i polimorfizm

Object Storage Arubacloud
0 głosów
297 wizyt
pytanie zadane 26 stycznia 2016 w C i C++ przez Dash Nałogowiec (29,650 p.)

Dlaczego to jest dozwolone: 

class Base; 
class Derived : public Base; 

std::unique_ptr<Derived> der (new Derived); 

std::unique_ptr<Base> bas (new Base); 


bas = std::move(der);  

-- To jest w pełni dozwolone

void foo ( std::unique_ptr<Base> ptr); 

foo(std::move(der));

-- a to już nie?! 

 

1 odpowiedź

+1 głos
odpowiedź 26 stycznia 2016 przez MetGang Nałogowiec (34,360 p.)
wybrane 27 stycznia 2016 przez Dash
 
Najlepsza

http://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D

std::unique_ptr nie posiada przeciążonego operatora przypisania dla kopii (tak jak ty masz w foo()), lecz posiada dla referencji rvalue (&&). Kompilator nie może znaleźć odpowiedniej funkcji. Poprawne będzie:

void foo (std::unique_ptr<Base>&& ptr);

I taka prawda: "std::move() doesn't move"

 

komentarz 26 stycznia 2016 przez Dash Nałogowiec (29,650 p.)
Niestety, nic z tego. Wersja którą podałem w przykładzie w teorii też powinna działać, używana jest w niektórych książkach (jako że interesujesz się SFML, może czytałeś SFML game development? Na tej funckji jest tam oparty cały SceneGraph).

Być może jest to wina tego że używam ndk? Z tego co zauważyłem brakuje tam kilku rzeczy ze standardu c++11 i 14.
komentarz 26 stycznia 2016 przez MetGang Nałogowiec (34,360 p.)
Jak tak teraz patrzę, to to twoje ma prawo działać. Jednak jak wspomniałeś może to być wina niekompletnego wspomagania C++11/14. Pisząc "nie jest dozwolone", masz na myśli jakieś ostrzeżenie gdzieś wyczytane czy błąd kompilatora?
komentarz 26 stycznia 2016 przez Dash Nałogowiec (29,650 p.)
Eclipse pluje błędem o niepoprawności argumentu i podpowiada że "kandydant" ma otrzymać std::unique_ptr<Base> zamiast Derived.
komentarz 26 stycznia 2016 przez MetGang Nałogowiec (34,360 p.)

To by w sumie się zgadzało z tym co wcześniej napisałem, po części. Napisałem od operatorze przypisania a w tym wypadku wywoływane są konstruktory. I to by się zgadzało. Nie jestem pewien, ale może być problem z tym, że unique_ptr<Base> nie jest tym samym obiektem co unique_ptr<Derived> i kompilator nie znajduję odpowiedniego konstruktora.

http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr

Nie znam się zbyt na wrapperach/pojemnikach na wskaźniki - używam zwykłych.

komentarz 27 stycznia 2016 przez Dash Nałogowiec (29,650 p.)
Cóż, ten sam kod, ta sama biblioteka kompilowane przy pomocy standardowego Gcc działa. Czyli szkopuł siedzi w NDK. Chciałem tego uniknąć, zupełnie nie wiem jak się to coś konfiguruje, ale mus to mus. Dzięki za pomoc :).

Podobne pytania

0 głosów
1 odpowiedź 189 wizyt
0 głosów
1 odpowiedź 91 wizyt
pytanie zadane 6 czerwca 2018 w SQL, bazy danych przez Adrian Paź Obywatel (1,270 p.)
0 głosów
2 odpowiedzi 169 wizyt
pytanie zadane 5 czerwca 2023 w C i C++ przez p4wix Obywatel (1,040 p.)

92,568 zapytań

141,420 odpowiedzi

319,624 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...