Saya mencoba untuk belajar C ++ jadi maafkan saya jika pertanyaan ini menunjukkan kurangnya pengetahuan dasar, Anda lihat, faktanya adalah, saya memiliki kurangnya pengetahuan dasar.
Saya ingin bantuan untuk mengetahui cara membuat iterator untuk kelas yang saya buat.
Saya memiliki kelas 'Bentuk' yang memiliki wadah Poin. Saya memiliki kelas 'Potongan' yang mereferensikan suatu Bentuk dan mendefinisikan posisi untuk Bentuk tersebut. Sepotong tidak memiliki Bentuk itu hanya referensi Bentuk.
Saya ingin itu tampak seperti Piece adalah sebuah wadah Poin yang sama dengan orang-orang dari referensi Shape itu tetapi dengan offset posisi Piece ditambahkan.
Saya ingin bisa beralih melalui Poin Piece sama seperti jika Piece adalah wadah itu sendiri. Saya telah melakukan sedikit pembacaan dan belum menemukan apa pun yang telah membantu saya. Saya akan sangat berterima kasih atas petunjuk apa pun.
Jawaban:
Anda harus menggunakan Boost.Iterators. Ini berisi sejumlah templat dan konsep untuk mengimplementasikan iterator dan adapter baru untuk iterator yang ada. Saya telah menulis artikel tentang topik ini ; itu di majalah ACCU Desember 2008. Ini membahas solusi elegan (IMO) untuk masalah Anda: mengekspos koleksi anggota dari suatu objek, menggunakan Boost.Iterators.
Jika Anda hanya ingin menggunakan stl, buku Josuttis memiliki bab tentang penerapan iterator STL Anda sendiri.
sumber
/ EDIT: Saya mengerti, iterator sendiri sebenarnya diperlukan di sini (saya salah membaca pertanyaannya). Tetap saja, saya membiarkan kode di bawah ini berdiri karena dapat bermanfaat dalam keadaan yang serupa.
Apakah iterator sendiri sebenarnya diperlukan di sini? Mungkin cukup untuk meneruskan semua definisi yang diperlukan ke wadah yang memegang Poin aktual:
Ini dengan asumsi Anda menggunakan
vector
internal tetapi jenisnya dapat dengan mudah disesuaikan.sumber
auto begin() -> decltype(m_shape.container.begin()) { return m_shape.container.begin(); }
Di sini Mendesain STL seperti Custom Container adalah artikel luar biasa yang menjelaskan beberapa konsep dasar tentang bagaimana kelas kontainer seperti STL dapat dirancang bersama dengan kelas iterator untuknya. Membalikkan iterator (sedikit lebih keras) meskipun dibiarkan sebagai latihan :-)
HTH,
sumber
Anda dapat membaca artikel ddj ini
Pada dasarnya, mewarisi dari std :: iterator untuk menyelesaikan sebagian besar pekerjaan untuk Anda.
sumber
std::iterator
ditandai ditinggalkan dari C ++ 17.Menulis custom iterators di C ++ bisa sangat verbose dan rumit untuk dipahami.
Karena saya tidak dapat menemukan cara minimal untuk menulis iterator khusus, saya menulis tajuk template ini yang mungkin bisa membantu. Sebagai contoh, untuk membuat
Piece
kelas iterable:Maka Anda akan dapat menggunakannya sebagai Kontainer STL normal:
Ini juga memungkinkan untuk menambahkan jenis iterator lain seperti
const_iterator
ataureverse_const_iterator
.Saya harap ini membantu.
sumber
Solusi untuk masalah Anda bukanlah menciptakan iterator Anda sendiri, tetapi menggunakan wadah dan iterator STL yang ada. Simpan titik-titik di setiap bentuk dalam wadah seperti vektor.
Apa yang Anda lakukan sejak saat itu tergantung pada desain Anda. Pendekatan terbaik adalah beralih melalui titik-titik dalam metode di dalam Shape.
Jika Anda perlu mengakses poin di luar Shape (ini bisa menjadi tanda dari desain yang kurang) Anda dapat membuat dalam metode Shape yang akan mengembalikan fungsi akses iterator untuk poin (dalam kasus itu juga membuat typedef publik untuk wadah poin). Lihatlah jawaban oleh Konrad Rudolph untuk detail dari pendekatan ini.
sumber