Набор из API, которые я обычно использую по следующей схеме связного списка:Оберточные связанные списки в итераторах
struct SomeObject
{
const char* some_value;
const char* some_other_value;
SomeObject* next;
}
LONG GetObjectList(SomeObject** list);
void FreeObjectList(SomeObject* list);
Этого API не мой, и я не могу изменить его.
Итак, я хотел бы инкапсулировать их конструкцию/уничтожение, доступ и добавить поддержку итератора. Мой план должен сделать что-то вроде этого:
/// encapsulate access to the SomeObject* type
class MyObject
{
public:
MyObject() : object_(NULL) { };
MyObject(const SomeObject* object) : object_(object) { };
const char* SomeValue() const
{
return NULL != object_ ? object_->some_value : NULL;
};
const char* SomeValue() const
{
return NULL != object_ ? object_->some_other_value : NULL;
};
private:
SomeObject* object_;
}; // class MyObject
bool operator==(const MyObject& i, const MyObject& j)
{
return // some comparison algorithm.
};
/// provide iterator support to SomeObject*
class MyObjectIterator
: public boost::iterator_adaptor< MyObjectIterator,
MyObject*,
boost::use_default,
boost::forward_traversal_tag >
{
public:
// MyObjectIterator() constructors
private:
friend class boost::iterator_core_access;
// How do I cleanly give the iterator access to the underlying SomeObject*
// to access the `next` pointer without exposing that implementation detail
// in `MyObject`?
void increment() { ??? };
};
/// encapsulate the SomeObject* creation/destruction
class MyObjectList
{
public:
typedef MyObjectIterator const_iterator;
MyObjectList() : my_list_(MyObjectList::Create(), &::FreeObjectList)
{
};
const_iterator begin() const
{
// How do I convert a `SomeObject` pointer to a `MyObject` reference?
return MyObjectIterator(???);
};
const_iterator end() const
{
return MyObjectIterator();
};
private:
static SomeObject* Create()
{
SomeObject* list = NULL;
GetObjectList(&list);
return list;
};
boost::shared_ptr<void> my_list_;
}; // class MyObjectList
Мои два вопроса:
Как чисто дать
MyObjectIterator
доступ к базовойSomeObject
для доступа кnext
указатель в связанном списке, не подвергая эта деталь реализации вMyObject
?В
MyObjectList::begin()
, как преобразовать указательSomeObject
в ссылкуMyObject
?
Спасибо, PaulH
Edit: сопряженного список API, я упаковка не мои. Я не могу их изменить.
И 'std :: list' не подходит для вас? –
@Nikolai - Связанный список не мой. Я не могу его изменить. – PaulH