Próbuję nauczyć się C ++, więc wybacz mi, jeśli to pytanie pokazuje brak podstawowej wiedzy, widzisz, faktem jest, że mam brak podstawowej wiedzy.
Potrzebuję pomocy przy tworzeniu iteratora dla klasy, którą stworzyłem.
Mam klasę „Kształt”, która zawiera zbiór punktów. Mam klasę „Piece”, która odwołuje się do Shape i definiuje pozycję Shape. Kawałek nie ma kształtu, tylko odnosi się do kształtu.
Chcę, żeby wyglądało na to, że Kawałek jest zbiornikiem Punktów, które są takie same jak te z Kształt, do którego się odnosi, ale z dodanym przesunięciem pozycji Kawałka.
Chcę mieć możliwość iteracji punktów elementu tak, jakby Element sam w sobie był pojemnikiem. Poczytałem trochę i nie znalazłem niczego, co mi pomogło. Byłbym bardzo wdzięczny za wszelkie wskazówki.
Odpowiedzi:
Powinieneś użyć Boost.Iterators. Zawiera szereg szablonów i koncepcji do implementacji nowych iteratorów i adapterów dla istniejących iteratorów. Napisałem artykuł na ten temat ; jest w magazynie ACCU z grudnia 2008 roku. Omawia eleganckie rozwiązanie (IMO) dla dokładnie twojego problemu: ujawnianie kolekcji elementów z obiektu przy użyciu Boost.Iterators.
Jeśli chcesz używać tylko stl, w książce Josuttisa znajduje się rozdział poświęcony implementowaniu własnych iteratorów STL.
źródło
/ EDYCJA: Rozumiem, własny iterator jest tutaj właściwie potrzebny (najpierw źle odczytałem pytanie). Mimo wszystko pozostawiam poniższy kod, ponieważ może być przydatny w podobnych okolicznościach.
Czy rzeczywiście potrzebny jest tutaj własny iterator? Być może wystarczy przesłać wszystkie wymagane definicje do kontenera zawierającego rzeczywiste Punkty:
Zakłada się, że używasz
vector
wewnętrznie, ale typ można łatwo dostosować.źródło
auto begin() -> decltype(m_shape.container.begin()) { return m_shape.container.begin(); }
Tutaj Projektowanie STL, takiego jak kontener niestandardowy, jest doskonałym artykułem, który wyjaśnia niektóre podstawowe pojęcia dotyczące tego, jak można zaprojektować klasę kontenera podobną do STL wraz z klasą iteratora. Iterator odwrotny (trochę trudniejszy) pozostaje jednak jako ćwiczenie :-)
HTH,
źródło
Możesz przeczytać ten artykuł o ddj
Zasadniczo dziedzicz po std :: iterator, aby wykonać większość pracy za Ciebie.
źródło
std::iterator
jest oznaczony jako przestarzały z C ++ 17.Pisanie niestandardowych iteratorów w C ++ może być dość rozwlekłe i trudne do zrozumienia.
Ponieważ nie mogłem znaleźć minimalnego sposobu na napisanie niestandardowego iteratora, napisałem ten nagłówek szablonu, który może pomóc. Na przykład, aby uczynić
Piece
klasę iterowalną:Wtedy byłbyś w stanie używać go jako zwykłego kontenera STL:
Pozwala również na dodawanie innych typów iteratorów, takich jak
const_iterator
lubreverse_const_iterator
.Mam nadzieję, że to pomoże.
źródło
Rozwiązaniem Twojego problemu nie jest tworzenie własnych iteratorów, ale wykorzystanie istniejących kontenerów i iteratorów STL. Przechowuj punkty w każdym kształcie w pojemniku, takim jak wektor.
Od tego momentu zależy od Twojego projektu. Najlepszym podejściem jest iteracja punktów w metodach wewnątrz Shape.
Jeśli potrzebujesz uzyskać dostęp do punktów poza Shape (może to być oznaką wadliwego projektu), możesz utworzyć w Shape metody, które zwrócą funkcje dostępu iteratora dla punktów (w takim przypadku również utwórz publiczny krój pisma dla kontenera punktów). Spójrz na odpowiedź Konrada Rudolpha, aby poznać szczegóły tego podejścia.
źródło