Указатель нулевой после попытки установить его в действительный итератор - PullRequest
0 голосов
/ 04 марта 2020

В настоящее время я работаю со структурой Qt5 и хочу перебрать список QGraphicsItems для условной манипуляции ими. Хотя я уже нашел лучший способ решения своей настоящей проблемы, похоже, что у этого первого подхода есть проблема, которая, как мне кажется, не имеет смысла.

Моя ситуация такова. У меня есть метод, который служит получателем для моего списка QGraphicsItems. Его возвращаемое значение - QList. Я использую этот метод получения для получения моего списка, а затем я использую метод begin () для получения итератора типа QList :: iterator. Я хочу использовать это для перебора всех элементов списка, очевидно.

Так что мой код выглядит следующим образом:

QList<QGraphicsItem *>::iterator it = this->items().begin();
std::cout << *(this->items().begin()) << std::endl;
std::cout << *it << std::endl;

Где this-> items () возвращает наш QList.

Я ожидаю, что оба этих вывода консоли будут одинаковыми. Хотя вот пример фактического вывода:

0x559716414740
0

Это, кажется, не имеет смысла для меня. Насколько мне известно, присвоение значения this-> items (). Begin () моей переменной it не должно приводить к тому, что переменная it будет иметь любое другое значение, чем то, что я получаю, когда непосредственно печатаю this-> items () .begin ().

Раньше я использовал переменную с именем auto it, но просто чтобы убедиться, я вручную набрал тип, который должен иметь возвращаемый объект. У них обоих одинаковое поведение.

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

Спасибо за чтение!

1 Ответ

0 голосов
/ 04 марта 2020

Поскольку this->items() возвращает объект, это временная копия вашего списка. Поскольку вы нигде не храните эту копию, любые сохраненные из нее итераторы становятся недействительными, когда временный список уничтожается в конце оператора.

Ваш код эквивалентен:

QList<QGraphicsItem *>::iterator it;
{
   // create a temporary copy of items
   QList<QGraphicsItem *> items = this->items();
   it = items.begin();
}
// temporary "items" is destroyed, "it" is now pointing to a non-existent list and is inavlid
std::cout << *(this->items().begin()) << std::endl;
std::cout << *it << std::endl;

Возможно, решение состоит в том, чтобы заставить items() возвращать список по (возможно, const) ссылке или, поскольку вы внутри своего собственного класса, вызывать items(), вероятно, не нужно, просто обратитесь к переменной-члену, содержащей список напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...