Вектор не принимает новый элемент должным образом

#c

#c

Вопрос:

Я вижу некоторое странное поведение в приведенном ниже коде. Моя консоль печатает

0lo1lo

когда на самом деле я ожидаю

0Hel1lo

Node.cpp

 std::vector<Node> Node::getChildren() {
    return children;
}

void Node::setChildren(std::vector<Node> childrenNodes) {
    children = childrenNodes;
}

void Node::addChild(Node child) {
    children.push_back(child);
    std::cout << child.getTitle();
}

std::string Node::getTitle() {
    return title;
}
  

Из основной функции

 Node root = Node("root");
root.addChild(Node("Hel"));
root.addChild(Node("lo"));
std::cout << "n";
std::vector<Node> children = root.getChildren();
for (int i = 0; i < children.size(); i  ) {
    Node menuItem = children[i];
    std::cout << i;
    std::cout << menuItem.getTitle();
}
std::cout << "n";
  

У кого-нибудь есть идея, почему getChildren(), похоже, получает вектор, в котором неточно указан первый вставленный мной элемент?

Комментарии:

1. Вы слышали о const и ссылках — повышает производительность кода. Также значения по умолчанию и списки инициализации.

2. Обычно частные переменные, особенно если они доступны для всего cpp, объявляются в заголовке. Кроме того, здесь происходит так много копирования, что вам действительно следует изучить ret по ref и ret по const ref. И я не совсем уверен, к чему вы клоните, имея отдельный один родительский и много узлов на контейнер, но это не кажется слишком практичным.

3. это консольный интерфейс, в котором каждое меню состоит из ряда опций, и каждая из них может состоять из дополнительных опций и т. Д. Root выступает в качестве отправной точки. Я был бы открыт для любых предложений альтернативных структур данных.

Ответ №1:

Вы используете глобальные переменные для хранения данных экземпляра:

 std::string title;
  

Это означает title , что в вашей программе есть только один, и если вы когда-либо измените его, Он изменится для каждого класса, функции и т. Д., Которые обращаются к нему.

Сделайте его нестатической переменной-членом Node , и ваша проблема исчезнет.

Комментарии:

1. Я бы принял ваш ответ сейчас, но он говорит мне подождать 12 минут, я думаю, это было легко: P