Login
Abstrakter Iterator из области С++
NEW 04.07.12 16:10
Zuletzt geändert 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 16:34
in Antwort evgher 04.07.12 16:10
По-моему, это плохая идея. Уж если хочется java like iterator, то и делай до конца, как в жабе: вместо перегрузки оператора сделай метод next.
NEW 04.07.12 17:37
Никак. Абстрактные классы нельзя инстанциировать :) Возвращай указатель/ссылку.
in Antwort evgher 04.07.12 16:10
В ответ на:
Как можно это заставить работать?
Как можно это заставить работать?
Никак. Абстрактные классы нельзя инстанциировать :) Возвращай указатель/ссылку.
NEW 04.07.12 17:47
in Antwort evgher 04.07.12 16:10
Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.
А если хотите дальше заниматься глупостью, ибо иначе написанное выше назвать трудно, operator++(int) должен возвращать ссылку на объект, так что добавьте &, и будет Вам щастье:):)
А если хотите дальше заниматься глупостью, ибо иначе написанное выше назвать трудно, operator++(int) должен возвращать ссылку на объект, так что добавьте &, и будет Вам щастье:):)
NEW 04.07.12 18:00
in Antwort Программист 04.07.12 17:37
Так дела в том что я инстанциирую не абстрактый класс. Смотри ниже
Это как раз и ведёт к выше упомянутой выдаче на экран.
В ответ на:
BinTree<int>::PostOrderIter it; // not abstract!
BinTree<int>::PostOrderIter it; // not abstract!
Это как раз и ведёт к выше упомянутой выдаче на экран.
NEW 04.07.12 18:09
Я тут с Вами не очень согласен. У постфикс-оператора это просто не возможно. Он возвращает копию объекта. Смотрите ниже пример из инета.
in Antwort ThorV 04.07.12 17:47, Zuletzt geändert 04.07.12 22:36 (evgher)
В ответ на:
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, то всё вполне вероятно зароботает.
Но меня интересует именно тот факт - возможно это или нет.
in Antwort ThorV 04.07.12 17:47
В ответ на:
Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.
Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.
Дело в том что идея состоит в том траверзировать контейнер с помощью разных итераторов в основу обобщающего итератора (абстрактного).
Т. е. все классы итераторы (специализированные или нет) это внутренние классы контейнера.
Самая главная проблема наверное и состоит в использовании template и virtual. Если использовать похожиую конструкцию без template, то всё вполне вероятно зароботает.
Но меня интересует именно тот факт - возможно это или нет.
NEW 04.07.12 18:25
Ага, только вот вернуть ты хочешь копию абстрактного класса :) А для того, чтобы вернуть копию абстрактного класса его (абстрактный класс) надо создать :) А этого делать нельзя :D
in Antwort evgher 04.07.12 18:00
В ответ на:
Так дела в том что я инстанциирую не абстрактый класс.
Так дела в том что я инстанциирую не абстрактый класс.
Ага, только вот вернуть ты хочешь копию абстрактного класса :) А для того, чтобы вернуть копию абстрактного класса его (абстрактный класс) надо создать :) А этого делать нельзя :D
NEW 04.07.12 18:55
Вы правы. Если использовать только префикс-часть, то компайлер не выдаёт ошибок.
Получается что для постфикс инкремент в СИ++ этот вариант невозможен.
in Antwort Программист 04.07.12 18:25
В ответ на:
Ага, только вот вернуть ты хочешь копию абстрактного класса
Ага, только вот вернуть ты хочешь копию абстрактного класса
Вы правы. Если использовать только префикс-часть, то компайлер не выдаёт ошибок.
Получается что для постфикс инкремент в СИ++ этот вариант невозможен.
NEW 04.07.12 18:59
in Antwort evgher 04.07.12 16:10
Это что за бред вообще? Курить стандарт С++ до полного прояснения. Чем не устроили обычные итераторы С++?
04.07.12 19:01
Не надо next. Он объединяет функции инкрементирования и возврата элемента, что делает многие алгоритмы более сложными.
in Antwort Simple 04.07.12 16:34
В ответ на:
Уж если хочется java like iterator, то и делай до конца, как в жабе: вместо перегрузки оператора сделай метод next
Уж если хочется java like iterator, то и делай до конца, как в жабе: вместо перегрузки оператора сделай метод next
Не надо next. Он объединяет функции инкрементирования и возврата элемента, что делает многие алгоритмы более сложными.
NEW 04.07.12 19:13
in Antwort scorpi_ 04.07.12 18:59, Zuletzt geändert 04.07.12 20:03 (evgher)
Тут не о бреде речь. Хочу немного ознaкомиться с програмированием на СТЛ.
Некоторые вещи меня просто интересуют, т. к. у меня ещё не хватает навыков.
Некоторые вещи меня просто интересуют, т. к. у меня ещё не хватает навыков.
NEW 04.07.12 21:50
in Antwort evgher 04.07.12 18:09
С какой стати постфикс-оператор невозможен???
Самое главное - итераторы реализуются шаблонами, иногда их специализируют, но не виртуальными классами. Это же на java, где кишки тянутся через весь язык до класса Object, зато нет шаблонов.
Самое главное - итераторы реализуются шаблонами, иногда их специализируют, но не виртуальными классами. Это же на java, где кишки тянутся через весь язык до класса Object, зато нет шаблонов.
NEW 04.07.12 22:25
in Antwort ThorV 04.07.12 21:50
Спасибо. Меня как раз возможность реализации и интересовала. Будем считать что вопрос исчерпан.
NEW 06.07.12 07:00
in Antwort 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 - вполне себе итератор, но шаблонами там и не пахнет :)
Очевидно, что реалицовывать итератор можно и без шаблонов. Например:
как видишь, итератор есть, а шаблонов нет :)
in Antwort 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
{
}
как видишь, итератор есть, а шаблонов нет :)
NEW 06.07.12 20:51
in Antwort Программист 06.07.12 10:42
NEW 07.07.12 08:13
in Antwort Murr 06.07.12 20:51