У меня есть чистый абстрактный класс и два производных класса, которые я использую для хранения таких же данных, скажем int
, но в разных структурах данных, скажем, map
и vector
.Пользовательский итератор для нескольких контейнеров в C++
class AbstractContainer {
public:
virtual MyIterator firstValue() = 0;
}
class ContainerMap : public AbstractContainer {
private:
map<K, int>;
public:
MyIterator firstValue() { // return iterator over map values (int) }
}
class ContainerVector : public AbstractContainer {
private:
vector<int>;
public:
MyIterator firstValue() { // return iterator over vector values (int) }
}
В ContainerMap
я могу подкласс map<K, int>::iterator
перебрать значения карты.
Но как я могу определить общий итератор MyIterator
, независимо от структуры данных, таким образом, чтобы данный указатель типа AbstractContainer
мог перебирать значения, игнорируя фактическую структуру, хранящую данные? И кроме того, это хорошая практика?
Редактировать
Этот вопрос является упрощение задачи. В моем проекте один из подклассов хранит мои объекты в памяти (в std::map
), а другой извлекает объекты из внешней базы данных. Я пытаюсь создать общий интерфейс для доступа к коллекции объектов, который не зависит от источника данных, потому что операции (поиск, вставка и удаление) будут точно такими же.
Посмотрите, как это делается в std, с обычными typedefs, определяющими итератор в шаблоне. Конечно, я предполагал, что вы делаете это ради удовольствия. Это УЖАСНАЯ практика. Используйте std для любого реального кода. –
Извините, я не понимаю, почему вы утверждаете, что это ужасная практика. Я использую std для структур данных, когда это возможно ... Я просто хочу, чтобы я обращался к объектам одинаково для разных структур данных. – Marco
Тип Erasure для итераторов - хорошая ссылка для начала. [http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/start_page.html](http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/start_page.html) –