Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Итератор для класса на основе list, Класс на основе list 
V
    Опции темы
rattick
Дата 26.11.2010, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Здравствуйте.
Есть класс в основе которого лежит контейнер list. Необходимо определить для него ряд методов. С обычными методами проблем не возникло, а вот с методами возвращающими и принимающими итераторы возникли проблемы. Собственно вопрос в том, как объявить итератор для моего класса?
Код

template<class T>
class mylist{
                list<T> *p;
public:
    mylist(){p=new list<T>;}

//как определить iterator
//например
iterator begin(){return p->begin();}
и т.д.
};

и как я понимаю там же надо будет определять перегрузку операторов?

PM MAIL   Вверх
boostcoder
Дата 26.11.2010, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



так:
Код

#include <list>
#include <iostream>

template<typename T>
struct mylist {
   mylist() {}
   
   typedef typename std::list<T>::iterator iterator;
   typedef typename std::list<T>::const_iterator const_iterator;
   
   iterator begin() { _list.begin(); }
   const_iterator begin() const { _list.begin(); }
   iterator end() { _list.end(); }
   const_iterator end() const { _list.end(); }
   
   void push_back(const T& item) { _list.push_back(item); }

private:
   std::list<T> _list;
};

int main() {
   mylist<int> list;
}


http://liveworkspace.org/code/a993e7b86902...2d07702d9f5c086
PM WWW   Вверх
rattick
Дата 26.11.2010, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Огромное спасибо!!!!!
вот как оказывается
Код

typedef typename std::list<T>::iterator iterator;

а я делал
Код

typedef std::list<T>::iterator iterator;

и компилятор ругался.
Кстати, а почему именно так надо?
PM MAIL   Вверх
Леопольд
Дата 26.11.2010, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(rattick @  26.11.2010,  06:13 Найти цитируемый пост)
Кстати, а почему именно так надо? 
Потому что  имя std::list<T>::iterator зависит от параметра шаблона "T". 

Шаблоны можно специализировать, и одинаковым именам придавать разный смысл, typename - указание компилятору что это имя типа (а не переменной, функции и т.д.)
Код
template<typename T> struct Traits;

template<> struct Traits<char>
{
    static char const * iterator() { return "theName"; }
};
template<> struct Traits<int>
{
    struct iterator {};
};

template<> struct Traits<double>
{
   enum { iterator = 0 };
};
Сперва осмысли, потом читай дальше.

typename нужен только внутри шаблонов (на этапе, когда "T" ещё не параметризирован конкретным типом): смотри пример

Это сообщение отредактировал(а) Леопольд - 26.11.2010, 09:54


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
maxim1000
Дата 26.11.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



иногда есть смысл обернуть итератор списка в свой
причина стадартная - не выставлять слишком много деталей реализации наружу

в данном случае интерфейс итератора из нового класса определяется интерфейсом итератора списка, а не потребностями пользователя нового класса, поэтому пользователи могут завязываться на любые особенности списков

например, списки поддерживают операцию splice, итератор нового класса тоже будет годиться для этой операции, вполне возможно, что пользователи класса этим воспользуются, а когда автор класса захочет сменить контейнер, его будет ждать неприятный сюрприз - он поломает кучу кода

реализовать обёртку несложно - можно использовать boost::iterator_facade и написать пару методов (которые вызывают соответствующую функциональность list:iterator)


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

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

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.