[C++] surcharge operateur d'assignation

Résolu/Fermé
flY - 5 févr. 2010 à 23:49
 flY - 8 févr. 2010 à 02:45
Bonjour,

dans ma classe j'ai un tableau dynamique a 2 dimensions de "bool" comme attribut et il semble que j'ai fait une erreur dans le code de cette surcharge car celle ci cesse de fonctionner au bout de quelque appel et et le tableau contient des données incorrectes,
à la l'affichage au lieux d'avoir des 1 et des 0 j'obtiens de plus grand nombre

dans ma classe j'ai les attribut suivant:
	private:
		int largeur;
		int longueur;
		int stock;
		bool **tab;

et voici le code qui pose probleme
en gros je copie les attributs et je sauvegarde l'adresse du tableau que j'avais au debut pour en créer un autre a la place que j'initialise avec les donnée de l'autre tableau et termine detruire le tableau de depart
MaClasse& MaClasse::operator=(const MaClasse& pp){
	bool **tmp= tab;
	largeur = pp.largeur;
	longueur = pp.longueur;
	stock = pp.stock;
	tab = new bool*[largeur];
	for(int i=0;i<largeur;i++){
		tab[i] = new bool[longueur];
		for(int j=0;j<longueur;j++){
			//tab[i][j] = new bool;
			tab[i][j] = pp.tab[i][j];
		}
	}
	for(int i=0;i< largeur;i++)
			delete[] tmp[i];
	delete[] tmp;
	return *this;
}


si vous pouvez m'aider je vous en serait enormement reconnaissant

3 réponses

azureus33 Messages postés 49 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 7 février 2010 7
6 févr. 2010 à 01:57
Déjà ta surcharge de l'opérateur = est fait partie de ta class il serait plus logique et juste de mettre la fonction void

Et comme tu ne te sert pas de tmp autant supprimé directement la matrice c'est inutile d'attendre la fin de la fonction surtout que la largeur a changé et donc tu n'est plus certains de supprimé toutes les colonnes.
Résultat une belle fuite mémoire.
0
merci pour ta reponse, ca m'a permis de mettre un eu d'ordre dans ma classe

mais j'ai un autre probleme qui se pose qui apparait justement a l'utilisation de cette surcharge:

en faite j'utilise un objet de cette classe comme attribut d'une autre classe; ca ne pose aucun probleme jusqu'a ce que j'utilise un assesseur de cette attribut

ClasseAttribut  MaClasse::getAttribut(){
                return monAttribut;
}

si j'ai le malheur d'executer l'instruction suivant le tableau dynamique de bool crée dans l'attribut devient totalement incoherent

MaClasse c;
ClasseAttribut a = c.getAttribut(); 
0
azureus33 Messages postés 49 Date d'inscription vendredi 16 janvier 2009 Statut Membre Dernière intervention 7 février 2010 7
7 févr. 2010 à 20:10
Dans le cadre suivant :


ClasseAttribut MaClasse::getAttribut(){
return monAttribut;
}

C'est le constructeur de copie qui est appelé et non l'opérateur =

As-tu le constructeur de copie implémenté dans ClassAttribut qui doit ressemblé a

ClasseAttribut(const ClasseAttribut &copie) ;

Par défault les compilateur comme g++ te génère toujours un constructeur par défault, de copie et destructeur.
Résultat il ne geule jamais si tu utilise ses constructeurs sans les avoirs implémenté.
0
un grand merci a toi tout fonctionne comme sur des roulettes
0