Tableau dynamique vector [Fermé]

Signaler
-
Messages postés
9687
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
21 juin 2020
-
Bonjour, j'ai un probléme avec le tableau dynamique vector ,comme vous voyer dans mon code la fonction ajouter admet deux parametre ( de type produit et double avec lesquels j'initialise mon ingrédient ) mais ça ne marche pas , et si un seul parametre qui est ingrédient ça marche ,



class Recette {
private:
double nbFois_;
string name ;
vector<Ingredient*> contenu;
public:
Recette(string testn,double testf):name(testn),nbFois_(testf){}
Recette(string testn):name(testn),nbFois_(1){}
void ajouter(const Produit& p, double quantite){
Ingredient* autre( const Produit &p,double quantite);
/*void ajouter (Ingredient* autre ){
contenu.push_back(autre);*/
contenu.push_back(autre);
}

}






Configuration: Windows / Chrome 76.0.3809.87

2 réponses

Messages postés
459
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
8 juillet 2020
60
Bonjour,

la ligne
Ingredient* autre( const Produit &p,double quantite);
déclare une fonction
autre()
qui reçoit 2 paramètres et retourne un pointeur. Je ne pense pas que c'est ce que tu voulais faire.

contenu
est un tableau de pointeur sur des ingrédients, donc on doit lui ajouter un pointeur qui doit pointer un
Ingredient
qui doit se trouver quelque part. Or ici le seul moyen serait d'utiliser
new
qui est une abomination. Alors erreur dans la définition de
contenu
, erreur dans les paramètres de la fonction
ajouter()
ou erreur d'un prof qui recommanderais d'utiliser
new
, je ne sais pas vers quoi t'orienter.
Messages postés
9687
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
21 juin 2020
1 182
void ajouter(const Produit& p, double quantite){
Ingredient autre(p, quantite);
contenu.push_back(<gras>&</gras>autre);
}

Si j'ai bien compris ce que tu cherches à faire. Par contre, j'ai un doute sur la portée de la variable "autre". Tu crées une variable propre à la fonction et tu assignes le pointeur à un vector. Il me semble qu'à la fin de la fonction, la variable est détruite et la mémoire libérée, ton pointeur pointe sur du vide et bonjour les erreurs de segmentation. Stocker des pointeurs, c'est bien pour éviter de dupliquer les objets, mais encore faut il que les dit objets soient quelque part.
Le C++, c'est bien car on gère soit même la mémoire, mais c'est contraignant, il faut réfléchir ce qu'on veux faire. Dans ton cas, tu fait un vector de pointeur, ça sou entend que les objets sont stockées ailleurs. OU que tu fais des new pour les créer MAIS a ce moment là, il ne faut pas oublier de les détruire à la fin avec un delete.
Soit tu considères que le vector est là pour conserver les objets et à ce moment là, c'est vector<Ingredient>, sans pointeur.
Les deux approches se défendent, en fonction de ce que tu veux faire et de comment tu conceptualises ton programme.