Проблема с доступом к векторным объектам shared_ptr - PullRequest
0 голосов
/ 09 мая 2020

У меня проблема с доступом к вектору shared_ptr из main. Моя функция turnOrder принимает 2 вектора sharedPtr, объединяет и сортирует их и помещает объекты в другой вектор (Units). Проблема в том, что когда я тестирую функцию с помощью циклов for, она дает именно то, что я хочу, но в int main (), Units вектор кажется пустым, и когда я пытаюсь получить доступ к любому объекту, он дает следующий код выхода: «код выхода -1073741819 (0xC0000005)».

void turnOrder( std::vector<std::shared_ptr<Monster>> monsters, std::vector<std::shared_ptr<Hero>> heroes,  std::vector<std::shared_ptr<Unit>> Units) {

    std::vector<std::shared_ptr<Unit>> units;

    units.reserve(8);

    units.insert(units.begin(), heroes.begin(), heroes.end());
    units.insert(units.end(), monsters.begin(), monsters.end());
//TESTING INITIAL VECTOR

    for(int i = 0; i < units.size(); i++){
        units[i]->printOut();
    }
    for (int i = 0; i < units.size(); i++) {
        units[i]->findSpeedRate();
    }
    struct X{

        inline bool operator() ( const std::shared_ptr<Unit> obj1, const std::shared_ptr<Unit> obj2){
            return(obj1->speedRate > obj2->speedRate);
        }
    };
    std::sort(units.begin(), units.end(), X());

    for(int i = 0; i < units.size(); i++){
        Units.emplace_back(units[i]);
    }

//TESTING ORDERED VECTOR
    for(int i = 0; i < Units.size(); i++){
        Units[i]->printOut();
    }

}


int main(){

    std::vector<std::shared_ptr<Unit>> Units;
    std::vector<std::shared_ptr<Monster>> monsters;
    std::vector<std::shared_ptr<Hero>> heroes;

    auto crusader1 = std::make_shared<Crusader>(1);
    heroes.emplace_back(crusader1);
//It goes the same with the other objects(monsters and heroes)

    turnOrder(monsters, heroes, Units);
    Units[0]->printOut();


}

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Передавать векторы по ссылке, а не по значению. Вы изменяете копии векторов внутри turnOrder. Просто измените объявление на

void turnOrder( std::vector<std::shared_ptr<Monster>>& monsters, std::vector<std::shared_ptr<Hero>>& heroes,  std::vector<std::shared_ptr<Unit>>& Units) {...}

Разница составляет & для каждой переменной. Также, пожалуйста, обратитесь к этому вопросу для получения дополнительной информации.

0 голосов
/ 09 мая 2020

На другом плакате есть точка зрения на копии, но я бы взглянул на это и сказал, если вы собираетесь заполнять единицы в этой функции, почему бы просто не вернуть единицы и не удалить параметр единиц. Тогда

Units=turnOrder(monsters, heroes)

имеет большой смысл.

...