2017-09-21 3 views
-3

Je travaille donc sur un projet scolaire en C++. L'idée de base est, que j'ai une zone contenant des carreaux (200x200 tuiles). Chaque objet Tile-Object contient un vecteur avec des pointeurs partagés de ma classe de créature pour les afficher dans une interface graphique. Le projet est une simulation, donc pour simuler chaque créature, nous devrions utiliser un vecteur contenant chaque créature. C'est pourquoi j'utilise des pointeurs partagés. Le vecteur, qui est spécifique à chaque tuile, fonctionne sans problème, mais celui avec chaque créature est toujours vide. C'est pourquoi je ne peux pas continuer à travailler sur la simulation.C++: Le vecteur contenant le pointeur partagé est toujours vide, a la taille 0

Voilà comment je place une créature et essayez de l'insérer dans le vecteur

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(); 

} 

Voilà comment je l'ai fait le vecteur pour les créatures par tuile. Fonctionne bien.

class TileLand { 

    public: 

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

}; 

C'est ici que le vecteur contenant chaque créature est défini.

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; 

}; 

Le constructeur de la classe de modèle. Celui-ci contient la créature-vecteur globale comme vous pouvez le voir ci-dessus.

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; 
} 

C'est là que j'essaie de faire une simulation pour chaque créature. Mais je ne sais pas quel est le problème, "créatures" est toujours vide. J'espère que quelqu'un peut au moins comprendre quel est mon problème, je ne sais pas comment le décrire mieux: /.

+4

Sur la base de votre titre, il serait très utile d'avoir un [mcve] qui crée un vecteur de ' shared_ptr', effectue des manipulations et montre que le vecteur est toujours vide. C'est difficile d'aider maintenant. – chris

+1

Je ne vois rien qui soit manifestement faux. Il y a de fortes chances que le problème ne soit pas dans le code fourni. Vous devrez probablement fournir un [MCVE] pour nous permettre de diagnostiquer le problème. –

+0

Comment 'getModel()' (appelé dans 'Presenter :: placeCreature') est-il déclaré (renvoie-t-il par référence)? Est-ce que 'Model :: simStep' est appelé pour la même instance' Model' que celle manipulée par 'Presenter :: placeCreature'? –

Répondre

1

Depuis Presenter::getModel() retourne une copie de l'instance Model, l'appel getModel().getCreatures().push_back(creature) ajoute une créature dans le vecteur creatures de cette copie temporaire (et non l'objet d'origine). Cette modification est ensuite immédiatement perdue lorsque la copie temporaire est hors de portée à la fin de l'instruction.

Ou ont Presenter::getModel() retourner une référence (comme vous l'avez fait pour Model::getCreatures()), ou tout simplement utiliser:

model.getCreatures().push_back(creature);