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

Usuwanie z vectora.

Object Storage Arubacloud
+1 głos
972 wizyt
pytanie zadane 24 grudnia 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
edycja 24 grudnia 2016 przez Munvik

Mam

std::vector<bullet> bullets;

I chcę usunąć z vectora element podany przez argument.

void tower::removeBullet(bullet * removeBullet)
{
	std::vector<bullet>::iterator it;
	it = std::find_if(bullets.begin(), bullets.end(), removeBullet);
	bullets.erase(it);
}

Narazie to wygląda tak lecz mam błąd: term does not evaluate to a function taking 1 arguments

Chcę wyszukać w vectorze ten element co jest podany w argumencie metody removeBullet i go usunąć.

Nie wiem jak to zmienić tak aby działało, help.

 

2 odpowiedzi

+1 głos
odpowiedź 24 grudnia 2016 przez Michał Muzyka Pasjonat (24,080 p.)

błąd związany jest z tym że metoda nazywa się tak samo jak zmienna, spróbuj tak:

void tower::removeBullet(bullet * rm)
{
    std::vector<bullet>::iterator it;
    it = std::find_if(bullets.begin(), bullets.end(), &rm);
    bullets.erase(it);
}

 

komentarz 24 grudnia 2016 przez Munvik Dyskutant (9,350 p.)
Faktycznie, nazwy się mieszały ale po zmianie nadal jest ten sam błąd :/
komentarz 24 grudnia 2016 przez Michał Muzyka Pasjonat (24,080 p.)
przywrócone 24 grudnia 2016 przez Michał Muzyka
a mógłbyś wkleić kod pliku .h
komentarz 24 grudnia 2016 przez Michał Muzyka Pasjonat (24,080 p.)
Już wiem użyj funkcji std::find() nie std::find_if()
komentarz 24 grudnia 2016 przez Munvik Dyskutant (9,350 p.)
binary '==': no operator found which takes a left-hand operand of type 'bullet' (or there is no acceptable conversion)

Coś takiego jak zamieniam na find()
komentarz 24 grudnia 2016 przez Michał Muzyka Pasjonat (24,080 p.)

do klasy bullet musisz przeciążyć operator==
tak żeby można było porównywać ze sobą obiekty

 

bool operator ==( const bullet  &bull)
{
    if() //kiedy pociski mają być takie same (u ciebie będą to wszystkie zmienne klasy)
    return true;
     else
return false;
}

 

komentarz 24 grudnia 2016 przez Munvik Dyskutant (9,350 p.)

Dodałem
 

bool bullet::operator==(const bullet & bull)
{
    
        if (*this == bull)
            return true;
        else
            return false;    
}



Nadal ten sam błąd :/

komentarz 24 grudnia 2016 przez Munvik Dyskutant (9,350 p.)
Chyba, że to nie tak ma być xD
komentarz 24 grudnia 2016 przez Michał Muzyka Pasjonat (24,080 p.)

nie możesz tego tak zrobić, kompilator nie wie jak ma porównać twoje obiekty
musiz to zrobić np. tak:

bool bullet::operator==(const bullet & bull)
{
     
        if (*this.position == bull.position) //jeśli składowe są publiczne 
            return true;
        else
            return false;    
}

 

komentarz 24 grudnia 2016 przez Munvik Dyskutant (9,350 p.)
Rozumiem
1
komentarz 24 grudnia 2016 przez criss Mędrzec (172,590 p.)

@Munvik nie możesz zdefiniować operatora= wykorzystując operator== XD

@Michał Troche krócej


bool bullet::operator==(const bullet & bull)
{
        return position == bull.position;
}

I nie muszą być publiczne. Klasa bullet ma dostęp do składowych klasy bullet (wszystkich obiektów).

+1 głos
odpowiedź 24 grudnia 2016 przez criss Mędrzec (172,590 p.)
A czytałeś dokumentacje std::find_if? Jako ostatni argument przyjmuje wskaźnik na funkcje która zwróci true gdy dostanie element którego szukasz.
komentarz 24 grudnia 2016 przez Munvik Dyskutant (9,350 p.)
Tak, nie wiedziałem jak użyć tego :/
komentarz 24 grudnia 2016 przez criss Mędrzec (172,590 p.)

Albo możesz zrobić tak jak ci napisał Michał - zdefiniować operator== dla bullet i użyć std::find. Albo użyć stf::find_if  i skorzystać z lambdy:

std::find_if(bullets.begin(), bullets.end(), [](const bullet & b) { return b.position == { 100, 100 }; });

To tylko przykład. Poczytaj o lambdach jeśli myślisz, że to może ci się przydać.

Podobne pytania

0 głosów
2 odpowiedzi 451 wizyt
pytanie zadane 6 stycznia 2018 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)
0 głosów
2 odpowiedzi 973 wizyt
pytanie zadane 11 maja 2017 w C i C++ przez Isild Użytkownik (580 p.)
0 głosów
2 odpowiedzi 150 wizyt
pytanie zadane 2 kwietnia 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

92,568 zapytań

141,422 odpowiedzi

319,642 komentarzy

61,957 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!

...