Неожиданное поведение итератора

0

В этом цикле я вызываю метод toString() для дочерних элементов svg. Но каждый раз, когда я получаю ошибку сегментации в первой итерации.

std::list<Tag*> children;

std::string TagSvg::toString() const{
     if(this->getChildren().empty()) return "<svg/>";

     std::string temp="";
     temp+="<svg>\n";

     for(std::list<Tag*>::const_iterator it=this->getChildren().begin(); it != this->getChildren().end(); ++it){
          temp+=(*it)->toString();
     }

     temp+="</svg>\n";

     return temp;
}


std::list<Tag*> Tag::getChildren() const{
     return children;
}

Как вы можете видеть на этом изображении, SVG Tag имеет дочерние элементы, он должен вызывать toString() в TagG на первой итерации, но он даже не устанавливает итератор правильно, как вы можете видеть, потому что TagG имеет 2 дочерних элемента, а разыменованный итератор имеет 0 дети и странные атрибуты. Может ли кто-нибудь показать мне, что я ошибся? Благодарю!

Изображение 174551

  • 0
    Пожалуйста, вставьте код для вашей функции getChildren. это возвращает по значению?
  • 0
    Можете ли вы попробовать изменить это "temp + = (* it) -> toString ();" в "temp + = it-> toString ();" это?
Теги:
iterator
segmentation-fault

1 ответ

2
Лучший ответ

вероятно, ваша функция getChildren возвращает значение, а затем

std::list<Tag*>::const_iterator it=this->getChildren().begin();

а также

it != this->getChildren().end();

указывает на начало и конец различных контейнеров. Из вашего редактирования ясно, что это именно так, поэтому, пожалуйста, сделайте изменение:

std::list<Tag*>& Tag::getChildren() const{
     return children;
}

или сделать это как:

std::list<Tag*> children = this->getChildren(); //now you ensure you work on
                                                //a single and the same container
for(std::list<Tag*>::const_iterator it=children.begin();
                                         it != this->children.end(); ++it){
          temp+=(*it)->toString();
     }
  • 0
    Ну, спасибо большое! Это была глупая ошибка ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню