Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Class] Probleme ajout d'un objet dans un tableau.

[POO] [std::vector]

Sujet résolu
22 février 2020 à 18:27:08

Bonjour,

j'ai deux tableaux, un de classe Entity,  l'autre de string.

J'ai une méthode invoke_golem(std::vector<Entity>) qui renvoie un tableau d'objets Entity, mais quand elle est utilisée, l'autre tableau déconne...

Code :

main.cpp

int main(int argc, char *argv[])
{
	srand(time(0));
	Armor diamond_armor(50, "Armure en diamant"), leather_tunic(10, "Tunique en cuir");
	Weapon end_sword(500, 5, "Epée de l'End", 100), twig(0, 1, "Brindille", 1);
	Entity gandalf(10000, 5000, 5, "Gandalf", &end_sword, &diamond_armor), gollum(500, 100, 1, "Gollum", &twig), bilbon(2000, 200, 3, "Bilbon Saquet", nullptr, &leather_tunic) ;
	std::vector<Entity> list { gandalf, gollum, bilbon };
	auto taille { std::size(list) };
	for(auto& e : list)
	{
		e.describe();
		std::cout << std::endl;
	}
	std::cout << "------------------" << std::endl;
	for(auto& e : list)
	{
		auto abilities = e.get_abilities();
		std::string choice_ability;
		for(auto& el : abilities)
		{
			std::cout << "a : " << el << std::endl;
		}
		do
		{
			choice_ability = abilities[rand() % std::size(abilities)];
		}while(choice_ability == "se soigner" && e.get_hp() == e.get_hp_max());
		if (choice_ability == "attaquer")
		{
			Entity target {e};
			do
			{
				target = list[rand() % taille];
			}while(target == e);
			e.attack(target);
		}
		else if (choice_ability == "se soigner")
			e.heal();
		else if (choice_ability == "invoquer un golem")
		{
			list = e.invoke_golem(list);
		}
		else
		{
			std::cout << e.get_name() << " ne fait rien. " << std::size(list) << " § " << std::size(abilities) << " § " << choice_ability << std::endl;
			for(auto& el : abilities)
			{
				std::cout << "a : " << el << std::endl;
			}
		}			
		std::cout << std::endl;
	}
	
	std::cout << "------------------" << std::endl;
	for(auto& e : list)
	{
		e.describe();
		std::cout << std::endl;
	}
	
	
	return 0;
}

Entity.cpp

std::vector<Entity> Entity::invoke_golem(std::vector<Entity> list)
{
	if (check_power(5, 1500))
	{
		m_mana -= 1500;
		std::string golem_name { "Golem de " + m_name };
		Entity golem(100, 10, 0, golem_name, nullptr, nullptr, 50);
		std::cout << m_name << " invoque un Golem !" << std::endl;
		list.push_back(golem);
		return list;
	}
	else return list;
}

Merci de votre réponse.


-
Edité par EnderRayquaza 22 février 2020 à 18:28:02

  • Partager sur Facebook
  • Partager sur Twitter
22 février 2020 à 19:03:58

Si tu modifies list, l'itérateur est invalide. Tu devrais utiliser le débugeur et active les debug de la stl, ce genre de chose se détecte assez vite.

  • Partager sur Facebook
  • Partager sur Twitter
22 février 2020 à 19:50:54

Mon débugueur ne me renvoie rien...
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2020 à 14:55:38

J'ai créé un nouveau tableau et je mets à jour l'ancien tbl après la boucle.

ça marche, mais est-ce il y a une autre façon qui permettrerai de le mettre dans la boucle ?

Merci.

-
Edité par EnderRayquaza 23 février 2020 à 14:56:07

  • Partager sur Facebook
  • Partager sur Twitter
26 février 2020 à 13:25:10

Règle de base:
- Ne jamais altérer (insérer / supprimer) le contenu d'un conteneur pendant que l'on itère dessus.

Rayquaza Delta a écrit:

J'ai créé un nouveau tableau et je mets à jour l'ancien tbl après la boucle.

ça marche, mais est-ce il y a une autre façon qui permettrerai de le mettre dans la boucle ?

Merci.

Pas vraiment, il faut procéder en 2 étapes. L'idée générale est de construire une pile d'actions a effectuer dans ta boucle pour les appliquer ensuite.
Cela peut se faire par exemple:
- Avec une pile d'éléments à ajouter.
- En "marquant" (ou répertoriant) les éléments à supprimer.
  • Partager sur Facebook
  • Partager sur Twitter