Проблемы с std :: vector :: push_back - PullRequest
0 голосов
/ 04 апреля 2020

Я столкнулся с неожиданным поведением при использовании std :: vector :: push_back в C ++. У меня есть следующий псевдокод, который, я надеюсь, достаточно ясен, чтобы продемонстрировать проблему, с которой я сталкиваюсь:

MyClass* myClass = new MyClass();
std::vector<MyObject*> newObjects;
myClass->VectorOperation(oldObject, newObjects);

MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*> newObjects) должен работать следующим образом:

void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*> newObjects)
{
    if (// Some condition on oldObject)
    {
        newObjects->push_back(oldObject);
    }
    else
    {
        // Operations that can result in translating a single oldObject into many MyObjects, e.g.
        MyObject* newObject1 = new MyObject();
        MyObject* newObject2 = new MyObject();
        newObjects->push_back(newObject1);
        newObjects->push_back(newObject2);
    }
}

Проблема Я вижу, что после успешного выполнения оператора if в VectorOperation вектор newObjects пуст, то есть вектор newObjects должен иметь одну запись, соответствующую oldObject. Я относительно новичок в C ++, но я не уверен, что мне здесь не хватает. Любая помощь очень ценится.

Спасибо!

РЕДАКТИРОВАТЬ: Я неправильно набрал подпись метода. Должно быть:

void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*>* newObjects)

1 Ответ

3 голосов
/ 04 апреля 2020

Добавить &:

void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*>& newObjects) {
//                                                                       ^
    if (// Some condition on oldObject)
    {
        newObjects.push_back(oldObject);
//                ^ Guess you meant . instead of ->.
    }
    ...
}

Теперь, когда вы передаете newObjects вектор, вы копируете его, поэтому push_back происходит с скопированным вектором, а не с оригиналом. Если вы добавите &, вы передадите newObjects по ссылке, поэтому вектор не будет скопирован, а oldObject будет возвращен к исходному вектору.

...