Доступ к неконстантным членам в списке объектов - PullRequest
0 голосов
/ 22 марта 2011

Я хотел бы получить доступ к членам объектов, содержащихся в списке таких объектов.

У меня есть класс CApp с членом std::list<Particle> PList, служащим списком частиц.

Класс Particle имеет члена void Update(), который, по моему пониманию, не может быть константным, поскольку он влияет на экземпляр (интеграция с эйлером и прочее).

Я хотел бы перебрать PList для обновлениявсе частицы.

Конструктор частиц включает в себя:

Particle::Particle(std::list<Particle>* PList_In) {
    PList = PList_In;
    PList->push_back(*this);
}

Несколько раз вызывается следующее:

Particle(&PList);

Таким образом, список создается.В качестве примечания, если бы кто-нибудь мог объяснить, что на самом деле там с точки зрения памяти (указатели, ссылки), это было бы замечательно.

Но в основном это ошибка:

// Update all particles
std::list<Particle>::const_iterator iter;
for (iter = PList.begin(); iter != PList.end(); iter++) {
    iter->Update();
}

с

error: passing ‘const Particle’ as ‘this’ argument of ‘void Particle::Update()’ discards qualifiers

Не знаете, что с этим делать, если требуется дополнительная информация / объяснения, дайте мне знать.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Используя const_iterator, вы сообщаете компилятору, что не собираетесь использовать этот итератор для методов, изменяющих указанных объектов.Изменяет ли метод объект или нет, определяется его константным квалификатором.Например, если у вас есть объявление метода, например int get() const; внутри class A, этот метод гарантирует, что он не изменит объекты class A.В вашем случае кажется, что Update не имеет спецификатора const, поэтому компилятор жалуется, что вы не можете вызвать неконстантную функцию, используя const_iterator.Вам нужно изменить тип итератора std::list<Particle>::iterator.

. В качестве примечания стоит передать объект list по ссылке, а не указатель в вашей функции.

1 голос
/ 22 марта 2011

Используя const_iterator, вы говорите, что не хотите изменять элементы списка.

Если хотите, используйте std :: list :: iterator.

...