Вход на сайт
Abstrakter Iterator из области С++
NEW 04.07.12 16:10
Последний раз изменено 04.07.12 16:12 (evgher)
Слудующая проблема
Изначально создаю обобщающий итератор, который определяет методы:\
Также создаю специализированный итератор
при компиляции выходит сообщение
Как можно это заставить работать?
Изначально создаю обобщающий итератор, который определяет методы:\
В ответ на:
class AbstractIter{
public:
// constructor
AbstractIter(Element *pC);
bool operator!=(AbstractIter &ri);
Entry& operator*() ;
virtual AbstractIter& operator++( ) = 0; //prefix
virtual AbstractIter operator++(int) = 0; //postfix
class AbstractIter{
public:
// constructor
AbstractIter(Element *pC);
bool operator!=(AbstractIter &ri);
Entry& operator*() ;
virtual AbstractIter& operator++( ) = 0; //prefix
virtual AbstractIter operator++(int) = 0; //postfix
Также создаю специализированный итератор
В ответ на:
class PostOrderIter : public AbstractIter{
public:
PostOrderIter();
virtual AbstractIter& operator++() ;
virtual AbstractIter operator++(int);
};
class PostOrderIter : public AbstractIter{
public:
PostOrderIter();
virtual AbstractIter& operator++() ;
virtual AbstractIter operator++(int);
};
при компиляции выходит сообщение
В ответ на:
Error: Cannot return a value of abstract class BinTree<int>::AbstractIter.
Where: While instantiating "BinTree<int>::PostOrderIter::operator++(int)".
Error: Cannot return a value of abstract class BinTree<int>::AbstractIter.
Where: While instantiating "BinTree<int>::PostOrderIter::operator++(int)".
Как можно это заставить работать?
NEW 04.07.12 17:47
в ответ evgher 04.07.12 16:10
Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.
А если хотите дальше заниматься глупостью, ибо иначе написанное выше назвать трудно, operator++(int) должен возвращать ссылку на объект, так что добавьте &, и будет Вам щастье:):)
А если хотите дальше заниматься глупостью, ибо иначе написанное выше назвать трудно, operator++(int) должен возвращать ссылку на объект, так что добавьте &, и будет Вам щастье:):)
NEW 04.07.12 18:09
Я тут с Вами не очень согласен. У постфикс-оператора это просто не возможно. Он возвращает копию объекта. Смотрите ниже пример из инета.
В ответ на:
operator++(int) должен возвращать ссылку на объект
operator++(int) должен возвращать ссылку на объект
Я тут с Вами не очень согласен. У постфикс-оператора это просто не возможно. Он возвращает копию объекта. Смотрите ниже пример из инета.
В ответ на:
Number& Number::operator++ ()
{
...
return *this;
}
Number Number::operator++ (int)
{
Number ans = *this;
++(*this); // or just call operator++()
return ans;
}
Number& Number::operator++ ()
{
...
return *this;
}
Number Number::operator++ (int)
{
Number ans = *this;
++(*this); // or just call operator++()
return ans;
}
NEW 04.07.12 18:19
Дело в том что идея состоит в том траверзировать контейнер с помощью разных итераторов в основу обобщающего итератора (абстрактного).
Т. е. все классы итераторы (специализированные или нет) это внутренние классы контейнера.
Самая главная проблема наверное и состоит в использовании template и virtual. Если использовать похожиую конструкцию без template, то всё вполне вероятно зароботает.
Но меня интересует именно тот факт - возможно это или нет.
в ответ ThorV 04.07.12 17:47
В ответ на:
Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.
Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.
Дело в том что идея состоит в том траверзировать контейнер с помощью разных итераторов в основу обобщающего итератора (абстрактного).
Т. е. все классы итераторы (специализированные или нет) это внутренние классы контейнера.
Самая главная проблема наверное и состоит в использовании template и virtual. Если использовать похожиую конструкцию без template, то всё вполне вероятно зароботает.
Но меня интересует именно тот факт - возможно это или нет.
06.07.12 07:00
в ответ evgher 04.07.12 22:25
Не вполне. Курить здесь - http://www.boost.org/doc/libs/1_50_0/libs/iterator/doc/index.html
А вообще главное умение для программиста - умение гуглить. Например так: https://www.google.com/search?hl=en&q=c%2B%2B+iterator+site%3Astackoverflow.com
А вообще главное умение для программиста - умение гуглить. Например так: https://www.google.com/search?hl=en&q=c%2B%2B+iterator+site%3Astackoverflow.com
NEW 06.07.12 10:42
Что-то говорит мне, что итераторы с шаблонами никак не связаны :) Просто потому что шаблон нужен для более высокого уровня абстракции, а итератор для перебора элементов.
Так например FindFirstFile и FindNextFile - вполне себе итератор, но шаблонами там и не пахнет :)
Очевидно, что реалицовывать итератор можно и без шаблонов. Например:
как видишь, итератор есть, а шаблонов нет :)
в ответ ThorV 04.07.12 21:50
В ответ на:
Самое главное - итераторы реализуются шаблонами, иногда их специализируют, но не виртуальными классами.
Самое главное - итераторы реализуются шаблонами, иногда их специализируют, но не виртуальными классами.
Что-то говорит мне, что итераторы с шаблонами никак не связаны :) Просто потому что шаблон нужен для более высокого уровня абстракции, а итератор для перебора элементов.
Так например FindFirstFile и FindNextFile - вполне себе итератор, но шаблонами там и не пахнет :)
Очевидно, что реалицовывать итератор можно и без шаблонов. Например:
В ответ на:
class IIterator
{
public:
virtual void * Prev () = 0;
virtual void * Next () = 0;
virtual void * Value () = 0;
}
class CList : public IIterator
{
}
class IIterator
{
public:
virtual void * Prev () = 0;
virtual void * Next () = 0;
virtual void * Value () = 0;
}
class CList : public IIterator
{
}
как видишь, итератор есть, а шаблонов нет :)