C ++:包含共享指针的向量总是空的,大小为0

时间:2017-09-21 13:19:41

标签: c++ pointers vector shared-ptr

所以我正在用C ++开展一个学校项目。基本的想法是,我有一个包含Tiles(200x200 Tiles)的区域。 每个Tile-Object都包含一个带有Creature-Class共享指针的向量,以便在GUI中显示它们。项目是模拟,所以为了模拟每个生物,我们应该使用包含每个生物的矢量。这就是我使用共享指针的原因。 Vector,特定于每个tile都可以正常工作,但是其中包含每个Creature的那个都是空的。这就是我无法继续进行模拟的原因。

这就是我放置一个生物并尝试将其插入向量

的方式
void Presenter::placeCreature(const CreatureType& type) const {
    int x = getModel().getTerrain()->getCursorPosX();
    int y = getModel().getTerrain()->getCursorPosY();

    std::shared_ptr<Creature> creature(std::make_shared<Creature>(type));

    TileLand::Climate climate(getModel().getTerrain()
                                        ->getTileMap()[x + y * Reference::Terrain::terrainWidth].getClimate());
    if (climate == TileLand::deepSea || climate == TileLand::shallowWater) {

        if (!creature->isLandCreature()) {
            getModel().getCreatures().push_back(creature);
            getModel().getTerrain()->getTileMap()[x + y * Reference::Terrain::terrainWidth]
                .getCreaturesOnTile().push_back(creature);

            logger << INFO << "Placed Creature: " << type.getName() << " on Tile (" << x << "|" << y << ")" << ENDL;
            return;
        }

    } else {

        if (creature->isLandCreature()) {
            getModel().getCreatures().push_back(creature);
            getModel().getTerrain()->getTileMap()[x + y * Reference::Terrain::terrainWidth]
                .getCreaturesOnTile().push_back(creature);

            logger << INFO << "Placed Creature: " << type.getName() << " on Tile (" << x << "|" << y << ")" << ENDL;
            return;
        }

    }

    ui.warn("Falsche Kreatur", R"(Diese Kreatur kann auf diesem Feld nicht platziert werden!)");
    creature.reset();

}

这就是我为每个瓦片生成矢量的方法。工作正常。

class TileLand {

    public:

    ...
    private:
    const Climate climate;
    std::vector<std::shared_ptr<Creature>> creaturesOnTile;

};

这是定义包含每个生物的向量的地方。

class Model {

    public:
    explicit Model(const CreatureList& creatureList);

    TerrainModel* getTerrain() const;
    CreatureList& getCreatureList();
    std::vector<std::shared_ptr<Creature>>& getCreatures();



    QPixmap calculateView(int sizeX, int sizeY);
    void simStep();


    private:
    CreatureList creatureList;
    std::vector<std::shared_ptr<Creature>> creatures;
    TerrainModel* terrain;
    int stepCounter;

};

Model-Class的构造函数。如上所示,这个包含全局Creature-Vector。

Model::Model(const CreatureList& creatureList) : creatureList(creatureList),
                                                terrain(new TerrainModel()),
                                                stepCounter(0) {

    for (CreatureType ty : creatureList) {
        ty.getInfoInOneLine();
    }
}

std::vector<std::shared_ptr<Creature>>& Model::getCreatures() {
    return creatures;
}

这就是我尝试为每个生物做模拟步骤的地方。但我不知道问题是什么,“生物”总是空的。

void Model::simStep() {
    qDebug("Creature");
    for (std::shared_ptr<biosim::Creature> cr : creatures) {
        qDebug("BIG");
        simPlants(cr);
    }
}

我希望有人至少可以理解我的问题是什么我不知道如何更好地描述它:/。

1 个答案:

答案 0 :(得分:1)

由于Presenter::getModel()会返回Model个实例的副本,因此getModel().getCreatures().push_back(creature)调用会将该生物添加到该临时副本的creatures向量中(而不是原始对象)。当临时副本超出声明末尾的范围时,此更改立即丢失。

Presenter::getModel()返回引用(就像您对Model::getCreatures()所做的那样),或者只使用:

model.getCreatures().push_back(creature);