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

Konwersja raw pointer -> smart pointer

0 głosów
425 wizyt
pytanie zadane 11 stycznia 2017 w C i C++ przez Munvik Dyskutant (9,350 p.)

Cześć. Mam kłopot, bo muszę usunąć z vectora smartPointerów element podany w argumencie jako raw Pointer. Narazie to wygląda tak jak na dole ale nie działa bo oczywiście "no conversion from shared_ptr<T> to monster * ".

std::vector<std::shared_ptr<monster>> monsters; //siedzi w klasie

void wave::removeMonster(monster  *m)
{
	std::vector<monster>::iterator it = std::find(monsters.begin(), monsters.end(), m);

	if (it != monsters.end())
	{
		monsters.erase(it);
	}
}

Prosiłbym od razu wyjaśnić co i dlaczego

1 odpowiedź

+1 głos
odpowiedź 11 stycznia 2017 przez criss Mędrzec (172,570 p.)
wybrane 11 stycznia 2017 przez Munvik
 
Najlepsza

Dokładnie to co jest napisane

no conversion from shared_ptr<T> to monster * 

 Uzyj std::find_if:

auto it = std::find_if(monsters.begin(), monsters.end(),
   [&](const std::shared_ptr<Monster> & sptr) { return sptr.get() == m; });

 

komentarz 11 stycznia 2017 przez Munvik Dyskutant (9,350 p.)
Wow, działa xD

Tylko jak ?
komentarz 11 stycznia 2017 przez criss Mędrzec (172,570 p.)
No przecież masz cały kod XD wejdź w dokumentacje std::find_if

find_if na kazdym elemencie vectora wywołuje przekazana w ostatnim argumencie funkcje. Jeśli zwróci true, to find_if zwraca ten iterator.

Za pomocą get() dostajesz sie do "raw pointera" (czyli to czego potrzebujemy) którego opakowuje std::shared_ptr. Uzyskany pointer porównujemy z pointerem m.

Szczerze mówiąc nie wiem czego tu możesz nie rozumieć, więc powiedz konkretnie to ci wytłumacze :P
komentarz 11 stycznia 2017 przez Munvik Dyskutant (9,350 p.)
[&](const std::shared_ptr<Monster> & sptr)

Co to jest [&] ?

komentarz 11 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
capture-list lambdy. Czyli jakie zmienne ze środowiska wywołania można używać w lambdzie. W tym przypadku wszystkie zmienne są przechwytywane przez referencje.

Podobne pytania

0 głosów
1 odpowiedź 376 wizyt
pytanie zadane 25 stycznia 2017 w Offtop przez jegor377 Stary wyjadacz (13,230 p.)
0 głosów
0 odpowiedzi 613 wizyt
pytanie zadane 12 maja 2020 w C i C++ przez Gurred Nowicjusz (240 p.)
0 głosów
1 odpowiedź 1,066 wizyt

93,765 zapytań

142,720 odpowiedzi

323,369 komentarzy

63,359 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...