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

question-closed operator= is implicitly deleted, pętla for z iteratorami std::vector

Object Storage Arubacloud
0 głosów
231 wizyt
pytanie zadane 11 listopada 2015 w C i C++ przez criss Mędrzec (172,590 p.)
zamknięte 13 listopada 2015 przez criss
   for(auto it = m_islands.begin();
       it != m_islands.end();)
   {
      it->update();

      if(it->getPosition().x < 0)
         m_islands.erase(it);
      else it++;
   }

m_islands to vector obiektów klasy Island.

Klasa Island ma zdefiniowany konstruktor kopiujący.

Przy kompilacji wyrzuca error:
 

error: use of deleted function 'Island& Island::operator=(const Island&)'|
note: 'Island& Island::operator=(const Island&)' is implicitly deleted because the default definition would be ill-formed:|
error: non-static const member 'const size_t Island::m_squareNumber', can't use default assignment operator|

 

 Kompletnie nie ogarniam. Gdzie ja tu używam operatora =? I właściwie dlaczego miałby być usunięty?

komentarz zamknięcia: Rozwiązanie w komentarzach pod odp. adriana.

1 odpowiedź

0 głosów
odpowiedź 11 listopada 2015 przez adrian17 Ekspert (346,880 p.)
Możesz pokazać 1. dokładnie gdzie wyskakuje błąd? (pewnie linia z .erase?) 2. Definicję klasy Island? 3. Jeśli klasa Island po czymś dziedziczy, pokaż też jej klasy bazowe.
komentarz 12 listopada 2015 przez adrian17 Ekspert (346,880 p.)
Trudno mi powiedzieć, nic oczywistego nie widzę. Powinieneś zastąpić memcpy przez normalne przypisanie obiektów (ogólnie powinieneś unikać memcpy na C++owych obiektach), ale w tym przypadku nie wydaje mi się żeby to naprawiło program.
komentarz 12 listopada 2015 przez criss Mędrzec (172,590 p.)
Masz racje, nie naprawiło. Najdziwniejsze, że kilka godzin temu ten sam kod działał. Wcześniej co prawda dziwne crashe były przy usuwaniu z vectora, ale tylko jeśli zawiera więcej niż 1 element. Ale teraz są w innym momencie, mimo że kod się nie zmienił. Może warto przeinstalować całe C::B razem z kompilatorem...
komentarz 13 listopada 2015 przez criss Mędrzec (172,590 p.)

Wróciłem do punktu w którym założyłem temat i:

Ostatecznie użyłem shared_ptr i wszystko działa. Teoretycznie bardziej odpowiedni wydawałoby się unique_ptr, ale wydaje mi się, że w moim przypadku nie ma to znaczenia w kwestii zwalniania pamięci. Ale nie byłem pewien czy unique_ptr nie przeszkadzałby w kopiowaniu... W każdym razie jeśli użyje unique_ptr zamiast shared_ptr, kompilator się burzy znowu o operator=() potrzebny dla .erase(). Twierdzi, że nie jest w stanie go utworzyć - identyczny błąd jak przy const. Nie mam pojęcia dlaczego.

Także... jeśli wszystko jest jak należy, pamięć jest zwalniana poprawnie.

Dwa ciekawe linki nt. używania shared_ptr i tablic:
http://stackoverflow.com/questions/13061979/shared-ptr-to-an-array-should-it-be-used

http://stackoverflow.com/questions/30780262/accessing-array-of-shared-ptr

komentarz 13 listopada 2015 przez adrian17 Ekspert (346,880 p.)

unique_ptr zamiast shared_ptr, kompilator się burzy znowu o operator=() potrzebny dla .erase(). Twierdzi, że nie jest w stanie go utworzyć - identyczny błąd jak przy const. Nie mam pojęcia dlaczego.

Ponieważ unique_ptr - jak sama nazwa sugeruje - cała jego idea i cel istnienia polega na tym, że nie można go kopiować.

komentarz 13 listopada 2015 przez criss Mędrzec (172,590 p.)
Aha, czyli dobrze podejrzewałem. Dzięki za upewnienie.

Podobne pytania

0 głosów
4 odpowiedzi 1,649 wizyt
pytanie zadane 12 sierpnia 2016 w C i C++ przez niezalogowany
+2 głosów
3 odpowiedzi 572 wizyt
pytanie zadane 11 kwietnia 2021 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
0 głosów
1 odpowiedź 441 wizyt
pytanie zadane 19 marca 2019 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

92,759 zapytań

141,682 odpowiedzi

320,453 komentarzy

62,104 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

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!

...