2014-01-14 5 views
1

Я должен реализовывать контейнеры (список и вектор) с использованием шаблонов, но у меня есть проблема. У меня есть следующий шаблон контейнера:Контейнерный интерфейс возвращает абстрактный тип итератор

template <typename T> 
class Container 
{ 
public: 
    class iterator 
    { 
     // ... pure virtual functions 
    }; 
    // ... pure virtual functions 
}; 

template <typename T> 
class List : public Container<T> 
{ 
public: 
    class iterator : public Container<T>::iterator 
    { 
     // ... implemented functions 
    } 
    // ... implemented functions 
}; 

Но я не знаю, как определить begin и end в Container, потому что я не могу сделать

virtual iterator begin() = 0; 

поскольку итератор является абстрактным классом.

Как я могу, в Container, указать тип возвращаемого значения функции, так что обратитесь к List<T>::iterator в List и Vector<T>::iterator в Vector? Или, может быть, вложенный итератор для контейнера - плохая идея?

Я видел, что могу использовать интеллектуальные указатели, но мой компилятор поддерживает только C++ 98.

EDIT: Поэтому я пошел без наследства, vector и list был абсолютно независимым. Но если вы видите какой-либо способ достичь того, что я просил выше, не стесняйтесь отвечать.

+0

Я не вижу причины 'iterator' должен быть в классе' Container' * вообще *, а 'begin()' и 'end()' должен возвращать 'typename T :: iterator', если я понимаю, что вы «пытаюсь добиться». – WhozCraig

+0

Я не понимаю, почему итератор должен быть в T, T не должен знать, что он находится в контейнере. –

+0

Можете ли вы рассказать нам больше о том, почему вам нужен родительский класс «Контейнер»? Конечно, стандартная библиотека не работает. –

ответ

2

Как я могу в Контейне указать возвращаемый тип функции, чтобы он ссылался на List :: iterator в List и Vector :: итераторе в Vector?

Вы не можете.

Или, может быть, вложенный итератор для контейнера - плохая идея?

Это определенно. Я не понимаю, почему вам нужен базовый класс или наследование Container. Весь смысл iterator s заключается в том, чтобы алгоритм, работающий над ними, был отвлечен от типа контейнера (до определенного уровня). Для этого вам не нужен базовый класс, и std::vector или любой другой контейнер STL обычно не реализуются таким образом.

+0

Спасибо за ваш ответ. –

Смежные вопросы