В этом цикле я вызываю метод 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 дети и странные атрибуты. Может ли кто-нибудь показать мне, что я ошибся? Благодарю!
вероятно, ваша функция 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();
}