Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Итератор - член класса 
V
    Опции темы
zhekha
Дата 26.3.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

class MyClass {

  map<string, string> channels;
  map<string, string>::const_iterator currentPos;

public:

  bool getFirst(string&a, string&b) const {

    currentPos = channels.begin();
    if (currentPos == channels.end())
      return false;
    a = (*currentPos).first;
    b = (*currentPos).second;

    return true;
  }

  bool getNext(string&a, string&b) const {

    if (currentPos == channels.end())
      return false;
    if (++currentPos == channels.end())
      return false;
    a = (*currentPos).first;
    b = (*currentPos).second;

    return true;
  }

};



error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::_Tree<_Traits>::const_iterator' (or there is no acceptable conversion)

Как с таким можно бороться?
Может подобный перебор элементов мапа следует делать как-то иначе?
PM MAIL   Вверх
Lazin
Дата 26.3.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



У тебя константный итератор, его нельзя изменять, а оператор = именно это и должен делать  smile 

замени его на обычный chanels у тебя-же не константа
PM MAIL Skype GTalk   Вверх
korian
Дата 26.3.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



бороться с этим надо так:
  bool getFirst(string&a, string&b) const {
  bool getNext(string&a, string&b) const {

вы ж меняете состояние объекта, зачем там const smile

Добавлено @ 10:10
или еще так можно бороться, наверно это будет правильнее в данном случае... хотя хз...
Код

class MyClass {

typedef map<string, string> mymap;
typedef map<string, string>::const_iterator myconstiterator;

  mymap channels;
  myconstiterator currentPos;

public:

  bool getFirst(string&a, string&b) const {

    const_cast<myconstiterator&>(currentPos) = channels.begin();
    if (currentPos == channels.end())
      return false;
    a = (*currentPos).first;
    b = (*currentPos).second;

    return true;
  }

  bool getNext(string&a, string&b) const {

    if (currentPos == channels.end())
      return false;
    if (++const_cast<myconstiterator&>(currentPos) == channels.end())
      return false;
    a = (*currentPos).first;
    b = (*currentPos).second;

    return true;
  }

};


Это сообщение отредактировал(а) korian - 26.3.2008, 10:12
PM   Вверх
zhekha
Дата 26.3.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А решение оказалось как всегда очень простым...
Спасибо, korian, верно подметил - забыл убрать const...
Только не понял зачем const_cast: const_iterator - итератор, который бегает по неизменяющейся последовательности, как я понимаю, а не неизменяемый...

Это сообщение отредактировал(а) zhekha - 26.3.2008, 10:39
PM MAIL   Вверх
korian
Дата 26.3.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



можно еще так бороться, этот вариант имху лучше второго.
но, имху, самый лучший - первый вариант, т.к. состояние объекта все-таки меняется
Код

class MyClass {

typedef map<string, string> mymap;
typedef map<string, string>::const_iterator myconstiterator;

  mymap channels;
  mutable myconstiterator currentPos;

public:

  bool getFirst(string&a, string&b) const {

    currentPos = channels.begin();
    ...
  }
...


Добавлено через 59 секунд
Цитата(zhekha @  26.3.2008,  09:33 Найти цитируемый пост)
Только не понял зачем const_cast - какая разница?

убрать константность в функции константного объекта
PM   Вверх
zhekha
Дата 26.3.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



На самом деле последний вариант - наиболее подходящий, т.к. функции - по функциолнальности являются get-методами и данные менять не должны, а, вот итератор могут...
PM MAIL   Вверх
Andrey44
Дата 26.3.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вообще где-то я читал - итератор делать членом класса - это плохой тон программирования smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
zhekha
Дата 26.3.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Andrey44 @ 26.3.2008,  10:45)
Вообще где-то я читал - итератор делать членом класса - это плохой тон программирования smile

Почему?
PM MAIL   Вверх
korian
Дата 26.3.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zhekha @  26.3.2008,  09:45 Найти цитируемый пост)
На самом деле последний вариант - наиболее подходящий, т.к. функции - по функциолнальности являются get-методами и данные менять не должны, а, вот итератор могут... 

если рассматривать объект класса MyClass, как объект, который является map-ом, только с другим интерфейсом - тогда имху правильный 3-й вариант.
а если рассматривать его как объект, который предоставляет доступ к map, тогда имху первый вариант лучше.
хотя лучше переархитектить класс вообще и не хранить итераторы  smile

Добавлено через 5 минут и 28 секунд
Цитата(zhekha @  26.3.2008,  09:46 Найти цитируемый пост)
Почему? 

потому что такой объект выполняет двойную роль. он является map'ом и iterator'ом одновременно.

PM   Вверх
Andrey44
Дата 26.3.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Где-то в своей проге ты можешь не уследить за изменениями итератора.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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