Основная проблема вашего решения заключается в том, что вы пытаетесь сделать это нестандартным способом, который имеет много ограничений и может затруднить использование экспертом, который хорошо понимает, как итераторы работают в STL.
Я постараюсь ответить на большинство вопросов менее техническим способом, который должен помочь понять, как это работает на практике.
1) Совместное использование типа приведет к некоторой проблеме, поскольку некоторые алгоритмы могут нуждатьсяболее одного активного итератора.Кроме того, он не учитывает SRP (принцип единой ответственности) и, следовательно, не является хорошей практикой проектирования.
2) Необходимо только возвращать то, что по сути ведет себя как итератор.
3) Или это может быть указатель, если данные непрерывны в памяти.
4) Обычно функция begin
возвращает итератор по значению.
5) Обычно функция end
возвращаетитератор до конца.Он также может вернуть объект-страж, если конец не является действительно позицией (например, входной поток или если последнее значение контейнера является часовым).
6) Вы можете поместить свой собственный typedef / aliases.внутри класса и используйте их соответствующим образом.
7) Тип возвращаемого значения оператора * почти всегда будет отличаться от типа итератора.
Тогда некоторые замечания / предложения
- В вашем случае
LinkedList
будет типом итератора (или вы будете использовать обертку вокруг этого). - Часто вы хотите, чтобы ваш контейнер был больше, чем итератор, если вы хотите иметь возможность узнать размер, например, без необходимости повторять весь список.Также контейнер может предоставить некоторую оптимизированную функцию-член, такую как
sort
в std::list
. - Исходный код STL может быть хорошим источником, если вы хотите знать, как это делают эксперты.
- Ваш кодне соблюдает
constness
и, следовательно, не будет работать, если вы замените Example example;
на const Example example;
. - Большинство ваших операторов не соблюдает обычное соглашение в своем объявлении.
- Ваш
begin
функция имеет побочный эффект. - С вашим кодом вы не сможете сохранить итератор на позиции в вашем списке.Это означает, что такой алгоритм, как сортировка или удаление совпадающих элементов, вероятно, потерпит неудачу.
- Помещение
void
в пустой список параметров - это, по сути, устаревший способ написания кода, который больше не должен использоваться в C ++.Это имеет полезную цель только в C. - Operator ++ обычно должен возвращать ссылку на это.
- Если вы хотите использовать часовой для конечного значения, лучше использовать ваш собственный тип (
enum
значение может сделать).В противном случае это позволило бы неожиданному сравнению скомпилироваться как example != 25
(и в этом случае можно предположить, что цикл завершится, когда значение k
равно 25), что затруднит понимание кода. - Почему бы не использовать
std::forward_list
вместо того, чтобы заново изобретать колесо. - Если вам действительно нужно использовать
LinkedList
, тогда STL может стать ценным источником информации о том, как правильно определять итераторы.