2017-01-18 6 views
0

Я пытаюсь изменить объект, используя итератор, но я получаю эту ошибку:Изменение объекта с помощью итератора

Error 1 error C2662: 'void Item::setCount(int)' : cannot convert 'this' pointer from 'const Item' to 'Item &'

1 IntelliSense: the object has type qualifiers that are not compatible with the member function

Это мой код:

void Customer::addItem(Item other)//add item to the set 
{ 
    set<Item>::iterator it; 
    it = _items.find(other); 

    if (it != _items.end()) 
    { 
     it->setCount((this->getCount((*it)) + 1)); 
    } 

    else 
     _items.insert(other); 
} 

И в этой линии у меня есть ошибки :

it->setCount((this->getCount((*it)) + 1)); 
+0

см. Ответ о изменяемых полях в методах const. – UmNyobe

ответ

3

итератор для std::setconst это, так как изменения записи может повлиять на порядок.

Чтобы обойти эту проблему, либо:

  • выбрать другой контейнер
  • сделать удаление + добавить операцию (т.е. удалить элемент из набора, изменить его, а затем добавить его в набор. снова)
  • использование mutable на полях, модифицированных setCount (при необходимости)
  • использования const_cast откинуть на const Несс элемента перед вызовом setCount (в крайнем случае)

Для последних двух вариантов убедитесь, что setCount ничего не изменяет, что изменяет порядок Item объектов.

+0

Спасибо за комментарий. Что мне делать, если я хочу обновить счетчик моего элемента, если я не могу использовать set? –

+0

@Yair - трудно сказать, не видя своего класса «Предмет», но лучше всего выбрать «выбрать другой контейнер». В вашем случае я бы рекомендовал удалить счетчик из элемента (в конце концов, элемент может иметь имя, цвет, вес, но обычно он не имеет счетчика), и с помощью 'std :: map ' (или 'unordered_map') для хранения счетчиков. –

+1

@YairB. : Я добавил несколько подробностей к моему ответу, который, надеюсь, прояснит ситуацию немного лучше. –