[C++] surcharge operateur d'assignation
Résolu
flY
-
flY -
flY -
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:
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
si vous pouvez m'aider je vous en serait enormement reconnaissant
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
A voir également:
- [C++] surcharge operateur d'assignation
- 0668 quel opérateur ✓ - Forum Opérateurs & Réseaux mobiles
- Opérateur de réseau mobile - Guide
- 0466 quel opérateur - Forum Mobile
- Connaitre l'opérateur d'un portable inconnu ? ✓ - Forum Mobile
- 0758 quel opérateur - Forum Opérateurs & Réseaux mobiles
3 réponses
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.
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.
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
si j'ai le malheur d'executer l'instruction suivant le tableau dynamique de bool crée dans l'attribut devient totalement incoherent
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();
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é.
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é.