Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Abstrakter Iterator из области С++

636  1 2 3 все
evgher постоялец04.07.12 16:10
evgher
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 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)".

Как можно это заставить работать?
#1 
Simple Nothing is f*cked04.07.12 16:34
Simple
NEW 04.07.12 16:34 
в ответ evgher 04.07.12 16:10
По-моему, это плохая идея. Уж если хочется java like iterator, то и делай до конца, как в жабе: вместо перегрузки оператора сделай метод next.
#2 
Программист знакомое лицо04.07.12 17:37
NEW 04.07.12 17:37 
в ответ evgher 04.07.12 16:10
В ответ на:
Как можно это заставить работать?

Никак. Абстрактные классы нельзя инстанциировать :) Возвращай указатель/ссылку.
#3 
ThorV прохожий04.07.12 17:47
ThorV
NEW 04.07.12 17:47 
в ответ evgher 04.07.12 16:10
Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.
А если хотите дальше заниматься глупостью, ибо иначе написанное выше назвать трудно, operator++(int) должен возвращать ссылку на объект, так что добавьте &, и будет Вам щастье:):)
#4 
evgher постоялец04.07.12 18:00
evgher
NEW 04.07.12 18:00 
в ответ Программист 04.07.12 17:37
Так дела в том что я инстанциирую не абстрактый класс. Смотри ниже
В ответ на:

BinTree<int>::PostOrderIter it; // not abstract!

Это как раз и ведёт к выше упомянутой выдаче на экран.
#5 
evgher постоялец04.07.12 18:09
evgher
NEW 04.07.12 18:09 
в ответ ThorV 04.07.12 17:47, Последний раз изменено 04.07.12 22:36 (evgher)
В ответ на:

operator++(int) должен возвращать ссылку на объект

Я тут с Вами не очень согласен. У постфикс-оператора это просто не возможно. Он возвращает копию объекта. Смотрите ниже пример из инета.
В ответ на:

Number& Number::operator++ ()
{
...
return *this;
}

Number Number::operator++ (int)
{
Number ans = *this;
++(*this); // or just call operator++()
return ans;
}

#6 
evgher постоялец04.07.12 18:19
evgher
NEW 04.07.12 18:19 
в ответ ThorV 04.07.12 17:47
В ответ на:

Вообще то итераторы предполагают использование template( хотя бы по Вашему типу Еntry), a шаблоны с virtual не дружат. Если хотите - делайте специализацию шаблонов, virtual тут не при чем.

Дело в том что идея состоит в том траверзировать контейнер с помощью разных итераторов в основу обобщающего итератора (абстрактного).
Т. е. все классы итераторы (специализированные или нет) это внутренние классы контейнера.
Самая главная проблема наверное и состоит в использовании template и virtual. Если использовать похожиую конструкцию без template, то всё вполне вероятно зароботает.
Но меня интересует именно тот факт - возможно это или нет.
#7 
Программист знакомое лицо04.07.12 18:25
NEW 04.07.12 18:25 
в ответ evgher 04.07.12 18:00

В ответ на:
Так дела в том что я инстанциирую не абстрактый класс.

Ага, только вот вернуть ты хочешь копию абстрактного класса :) А для того, чтобы вернуть копию абстрактного класса его (абстрактный класс) надо создать :) А этого делать нельзя :D
#8 
evgher постоялец04.07.12 18:55
evgher
NEW 04.07.12 18:55 
в ответ Программист 04.07.12 18:25
В ответ на:

Ага, только вот вернуть ты хочешь копию абстрактного класса

Вы правы. Если использовать только префикс-часть, то компайлер не выдаёт ошибок.
Получается что для постфикс инкремент в СИ++ этот вариант невозможен.
#9 
  scorpi_ завсегдатай04.07.12 18:59
04.07.12 18:59 
в ответ evgher 04.07.12 16:10
Это что за бред вообще? Курить стандарт С++ до полного прояснения. Чем не устроили обычные итераторы С++?
#10 
  scorpi_ завсегдатай04.07.12 19:01
NEW 04.07.12 19:01 
в ответ Simple 04.07.12 16:34
В ответ на:
Уж если хочется java like iterator, то и делай до конца, как в жабе: вместо перегрузки оператора сделай метод next

Не надо next. Он объединяет функции инкрементирования и возврата элемента, что делает многие алгоритмы более сложными.
#11 
evgher постоялец04.07.12 19:13
evgher
NEW 04.07.12 19:13 
в ответ scorpi_ 04.07.12 18:59, Последний раз изменено 04.07.12 20:03 (evgher)
Тут не о бреде речь. Хочу немного ознaкомиться с програмированием на СТЛ.
Некоторые вещи меня просто интересуют, т. к. у меня ещё не хватает навыков.
#12 
Simple Nothing is f*cked04.07.12 20:29
Simple
NEW 04.07.12 20:29 
в ответ evgher 04.07.12 19:13
stl весъ на шаблонах :)
#13 
Simple Nothing is f*cked04.07.12 20:30
Simple
NEW 04.07.12 20:30 
в ответ scorpi_ 04.07.12 19:01
зато он решает проблему автора :)
#14 
ThorV прохожий04.07.12 21:50
ThorV
NEW 04.07.12 21:50 
в ответ evgher 04.07.12 18:09
С какой стати постфикс-оператор невозможен???
Самое главное - итераторы реализуются шаблонами, иногда их специализируют, но не виртуальными классами. Это же на java, где кишки тянутся через весь язык до класса Object, зато нет шаблонов.
#15 
evgher постоялец04.07.12 22:25
evgher
NEW 04.07.12 22:25 
в ответ ThorV 04.07.12 21:50
Спасибо. Меня как раз возможность реализации и интересовала. Будем считать что вопрос исчерпан.
#16 
  scorpi_ завсегдатай06.07.12 07:00
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
#17 
Программист знакомое лицо06.07.12 10:42
NEW 06.07.12 10:42 
в ответ 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
{
}

как видишь, итератор есть, а шаблонов нет :)
#18 
Murr патриот06.07.12 20:51
Murr
NEW 06.07.12 20:51 
в ответ Программист 06.07.12 10:42
итератор есть
-----
Где? Я не вижу ни одной возможности получить этот итератор...
#19 
ThorV прохожий07.07.12 08:13
ThorV
NEW 07.07.12 08:13 
в ответ Murr 06.07.12 20:51
+100:)
Как у Ходжи Насреддина: даже если 100 раз сказать халва, во рту слаще не станет...
#20 
1 2 3 все