Wpis z mikrobloga

Mirki... mam problem z iteratorem w rangeloop w #cpp.
Mianowicie...
Mam klasę abstrakcyjną Object.
3 klasy dziedziczą po Object: StringObject, IntObject, DoubleObject.
Utworzyłem do tego listę, która przetrzymuje wskaźniki do obiektów typu Object.
Następnie utworzyłem zagnieżdżoną klasę iterator w klasie List i tu zaczynają sie problemy...

Gdy wrzucę mojego iteratora do pętli for(;;) to wszystko działa, natomiast gdy wrzucę ją do pętli range
loop, wyrzuca mi błąd, który nie do końca rozumiem, bo dlaczego chce Object konwertować do iteratora?

Tutaj zamieszczam kod, ale wszystko wrzuciłem do jednego pliku, więc może być on trudny do przejrzenia xD

#programowanie #cplusplus
Pobierz OstryKepucz - Mirki... mam problem z iteratorem w rangeloop w #cpp.
Mianowicie...
M...
źródło: comment_OKUHGtznlzQym70GPFyB4geNLWaRwzlM.jpg
  • 22
@MamCieNaHita: gdy używamy "oryginalnej" listy ona także ma zdefiniowane iteratory. I czy tamten iterator w wyniku dereferencji też zwraca obiekt z listy?
Edit. Jeśli tak to w jaki sposób został rozwiązany problem zwracania referencji i zwykłej "skopiowanej wartości"
@MamCieNaHita: i jeszcze jeśli cię już tak wykorzystuje( ͡° ͜ʖ ͡°) to może spytalbym czy wiesz może o co tu mogło chodzić autorowi?

Proszę o zrobienie iteratora, który by czytał plik linijka w linijkę i wyświetlał na ekranie
gdy używamy "oryginalnej" listy ona także ma zdefiniowane iteratory. I czy tamten iterator w wyniku dereferencji też zwraca obiekt z listy?


@OstryKepucz: pytasz to std::list? ona trzyma sama w sobie obiekty przez wartośc, ale operator* zwraca referencję do trzymanego obiektu. przez to, że trzyma przez wartość, to średnio się nadaje do trzymania polimorficznych obiektów(chyba, że przez wskaźnik lub inteligentny wskaźnik).

Proszę o zrobienie iteratora, który by czytał plik linijka w
@MamCieNaHita: hmmm, jeśli zwraca referencję to czegoś nie rozumiem... dlaczego, gdy zrobię listę wskaźników w std::list mogę użyć for( auto it : stdlist), a u mnie gdzie iterator też zwraca referencję muszę użyć for( auto & it: mylist) ???

A co do drugiego... ogólny zamysł rozumiem.
Ale jak to ma wyglądać, Iterator ma być klasą? Iterator musi być "czegoś", musi mieć jakiś swój "begin()", a tworząc samą klasę iterator,
@OstryKepucz: Range-for nie dziala tak jak myslisz, do zmiennej nie jest przypisany iterator, tylko wartość typu T ktory przechowuje kontener. Wlasnie dlatego jest to takie fajne, bo programując nie musisz wcale dotykać iteratorów.
@Sedd: no tak tylko że rangeloop używa iteratorów i dereferencji (o ile się nie myle xD), więc musi w jakiś sposób dokonywać dereferncji na iteratorze, który zwraca typ to co przetrzymuje dana np lista.
Zatem dlaczego mogę std liście użyć for( auto it : stdlist) i for( auto ⁢ : stdlist), a u mnie po zamianie, żeby dereferencja iteratora zwracała wskaźnik (tak jak "oryginalny" iterator std::list który przetrzymuje wskaźniki ),
@OstryKepucz: Z tego co widze na screenie to napisales for(List::iterator it). Blad jest w typie a nie w tym czy jest referencja czy jej nie ma. Jak dasz samo auto to kompilator zrobi sobie z tego object i powinno dzialac, o ile object ma konstruktor kopiujacy. Tak samo powinno dzialac jak dasz for(Object it) - niezaleznie od tego czy dasz &
@OstryKepucz: jeżeli zwracasz wskaźnik przez wartość, to nie możesz go przypisać do non-const referencji - musisz albo przez wartość, albo do const referencji. dereferencja iteratora std::list zwraca referencję do wskaźnika, więc auto& działa.