• 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
39 wizyt
pytanie zadane 11 stycznia w C i C++ przez użytkownika Munvik Gaduła (4,510 punkty)

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 przez użytkownika Criss Szeryf (92,260 punkty)
wybrane 11 stycznia przez użytkownika 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 przez użytkownika Munvik Gaduła (4,510 punkty)
Wow, działa xD

Tylko jak ?
komentarz 11 stycznia przez użytkownika Criss Szeryf (92,260 punkty)
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 przez użytkownika Munvik Gaduła (4,510 punkty)
[&](const std::shared_ptr<Monster> & sptr)

Co to jest [&] ?

komentarz 11 stycznia przez użytkownika unknown Nałogowiec (26,060 punkty)
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ź 34 wizyt
pytanie zadane 25 stycznia w Offtop przez użytkownika jegor377 Stary wyjadacz (12,540 punkty)
0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 16 listopada 2015 w C i C++ przez użytkownika dariusz Obywatel (1,360 punkty)
0 głosów
1 odpowiedź 28 wizyt
pytanie zadane 15 maja 2016 w C i C++ przez użytkownika Typowy Janusz Gaduła (4,290 punkty)
...