Вы бы сделали MyObjectIterator
другом MyObject
.Я не вижу лучшего способа.И действительно, я думаю, что итераторы получают разумный доступ к друзьям, необходимый им для выполнения своих обязанностей.
Похоже, вы не рассматривали, как и где ваш экземпляр MyObject
будут храниться.Или, возможно, это то, из-за чего возникает этот вопрос.Кажется, у вас должен быть отдельный связанный список MyObjects в вашем MyObjectList.Тогда, по крайней мере, MyObjectList::begin()
может просто получить первый MyObject
из вашего внутреннего связанного списка из них.И если единственные операции, которые могут изменять или переупорядочивать этот список, когда-либо выполняются только через предоставленные вами итераторы, то вы можете без проблем синхронизировать эти списки без особых проблем.В противном случае, если в используемом вами API есть функции, которые берут необработанный связанный список SomeObject
и манипулируют им, у вас могут возникнуть проблемы.
Я понимаю, почему вы 'мы пытались спроектировать эту схему, но наличие отдельных объектов MyObject, которые указывают на SomeObject, даже через сами объекты SomeObject, составляют реальную структуру списка .... Это не простой способ обернуть список.
Самая простая альтернативапросто чтобы покончить с MyObject полностью.Позвольте вашим итераторам работать непосредственно с экземплярами SomeObject и возвращать их при разыменовании.Конечно, это делает SomeObject открытым, особенно его элемент next
.Но действительно ли это достаточно большая проблема, чтобы оправдать более сложную схему, чтобы обернуть все это?
Другим способом решения проблемы может быть MyObject
частное наследование от SomeObject
.Затем каждый экземпляр SomeObject может быть передан как ссылка на экземпляр MyObject и таким образом передан внешнему миру, скрывая, таким образом, детали реализации SomeObject и выставляя только нужные публичные функции-члены.Стандарт, вероятно, не гарантирует, что это сработает, но на практике, поскольку они, скорее всего, будут иметь точно такие же схемы памяти, что вы сможете избежать этого.Тем не менее, я не уверен, что я когда-либо попробовал бы такое в реальной программе, если бы в этом не было крайней необходимости.
Последняя альтернатива, которую я могу придумать, - это просто перенести данные в список более удобных данных.структуры после того, как вам дал этот API.И затем, конечно, перенести его обратно в необработанный список SomeObject, только если необходимо передать его обратно в API.Просто сделайте свой собственный SomeObjectData
или что-то еще, чтобы сохранить строки и поместите их в std::list
.Насколько это возможно для вас, зависит от того, как эти данные используются в контексте упомянутого вами API.Если есть другие функции API, которые изменяют списки SomeObject, и вам нужно часто их использовать, то постоянное преобразование списков SomeObject в std::list<SomeObjectData>
и обратно может быть раздражающим.