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

Unique_ptr, dziedziczenie i kontenery.

VPS Starter Arubacloud
0 głosów
235 wizyt
pytanie zadane 1 maja 2018 w C i C++ przez Łukasz Wasilewski Mądrala (5,190 p.)

Cześć,

mam problem ze zrozumieniem unique_ptr i znów potrzebuję Waszej pomocy.

Zacznę od tego, że mam funkcję:

unique_ptr<accessories> map_level::objectFactory(int type)

Zwraca mi ona unikalny wskaźnik na nowo utworzony obiekt danego typu.

Następnie, w drugiej funkcji używam tej metody do stworzenia danego obiektu:

unique_ptr<accessories> temp = objectFactory(type);

Posiadam także 2 wektory, w których przechowuję odpowiednio obiekty klasy accessories enemies (enemies dziedziczy z accessories).

	vector <unique_ptr <accessories>> objectsVector;
	vector <unique_ptr <enemies>> enemiesVector;

Potrzebuję teraz sprawdzić, czy zwrócony obiekt jest typu enemies i przypisać go do odpowiedniego wektora.

enemies *isEnemie = dynamic_cast<enemies *>(temp.get());
if (isEnemie)
{
	unique_ptr <enemies> enemie = make_unique<enemies>(isEnemie);
	enemiesVector.push_back(std::move(enemie));
}
else
{
	objectsVector.push_back(std::move(temp));
}

Niestety nie mogę tego wykonać, ponieważ wyskakuje mi błąd: 

Severity    Code    Description    Project    File    Line    Suppression State
Error    C2664    'enemies::enemies(const enemies &)': cannot convert argument 1 from 'enemies *' to 'const enemies &'   

Czy może ktoś mi wyjaśnić, dlaczego to nie działa i jak temu zaradzić? 
 

Mam jeszcze jedno pytanie, czy jeśli mam ten wektor unikalnych wskaźników, to czy na jego podstawię mogę zwrócić normalny wskaźnik? Wiem, że służy do tego .get(), ale nie rozumiem logiki, w tym momencie mój unikalny wskaźnik przestanie być unikalny. 

 

 

2 odpowiedzi

+1 głos
odpowiedź 1 maja 2018 przez Radfler VIP (101,030 p.)
wybrane 1 maja 2018 przez Łukasz Wasilewski
 
Najlepsza
unique_ptr <enemies> enemie = make_unique<enemies>(isEnemie);

Funkcja make_unique przyjmuje argumenty, które przesyła bezpośrednio do konstruktora klasy enemies. Z treści błędu wynika, że ta klasa nie posiada konstruktora przyjmującego argument typu enemies*. To powinno pomóc:

unique_ptr <enemies> enemie = make_unique<enemies>(*isEnemie);
// wysyłamy obiekt do konstruktora kopiującego, nie wskaźnik

#PS

Myślę, że do wykonania Twojego zadania będzie lepszy shared_ptr, a nie unique_ptr.

1
komentarz 1 maja 2018 przez Łukasz Wasilewski Mądrala (5,190 p.)

Bardzo, bardzo dziękuję. Nie dość że działa, to jeszcze zrozumiałem w czym leży błąd. 

Podążę również za wskazówką i poczytam o shared_ptr

Jeszcze raz dziękuję! smiley

+1 głos
odpowiedź 1 maja 2018 przez NIMuser Stary wyjadacz (11,030 p.)
Tu masz blog po polsku gdzie jest to nieźle wytłumaczone:

http://devcode.pl/programowanie/cpp/cpp11/

Podobne pytania

0 głosów
2 odpowiedzi 273 wizyt
pytanie zadane 12 sierpnia 2021 w C i C++ przez Pawel1995 Gaduła (3,810 p.)
0 głosów
1 odpowiedź 153 wizyt
+1 głos
2 odpowiedzi 643 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...