Surcharge d'opérateur (opérateur+)
Résolu
aure2015
-
Fallentree Messages postés 2309 Date d'inscription Statut Membre Dernière intervention -
Fallentree Messages postés 2309 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis entrain de créer en petit programme et j'ai une classe couleur, avec trois entier et un char*, les constructeurs et destructeurs sont fonctionnelles et j'ai trois constante statique ROUGE, VERT, BLEU.
L'ennuie c'est lors de mon operator+, on m'envoie l'erreur segmentation fault (core dumped). Et je ne comprends vraiment pas où est l'erreur. (J'ai déjà créé un operator=)
Voici le code:
Je suis entrain de créer en petit programme et j'ai une classe couleur, avec trois entier et un char*, les constructeurs et destructeurs sont fonctionnelles et j'ai trois constante statique ROUGE, VERT, BLEU.
L'ennuie c'est lors de mon operator+, on m'envoie l'erreur segmentation fault (core dumped). Et je ne comprends vraiment pas où est l'erreur. (J'ai déjà créé un operator=)
Voici le code:
int main () { Couleur C, C1(Couleur::ROUGE), C2(Couleur::BLEU) C= C1+C2 cout << "C:"; <<C.Affiche; cout << endl; }
Couleur Couleur::operator+ (const Couleur C1) const { Couleur C2(*this) C2.setRouge(C2.getRouge()+C1.getRouge()); C2.setBleu(C2.getBleu()+C1.getBleu()); C2.setVert(C2.getVert()+C1.getVert()); return C2; }
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
A voir également:
- 0650 operateur
- 0650 quel opérateur ✓ - Forum Opérateurs & Réseaux mobiles
- 0644 quel opérateur ✓ - Forum Mobile
- 06 86 quel opérateur ✓ - Forum Mobile
- Opérateur de réseau mobile - Guide
- 0466 quel opérateur - Forum Mobile
4 réponses
La 3ième ligne dans le corps du
Il y a beaucoup de fonctions utilisées dans ton
Il faut voir si ça n'est pas une de ces fonctions qui plante.
main()ne doit pas compiler.
Il y a beaucoup de fonctions utilisées dans ton
operator+, dans l'ordre :
- constructeur par copie : 2 fois
-
getRouge()
: 2 fois -
setRouge()
: 1 fois -
getBleu()
: 2 fois -
setBleu()
: 1 fois -
getVert()
: 2 fois -
setVert()
: 1 fois - operateur de copie : 1 fois
- destructeur : 2 fois
Il faut voir si ça n'est pas une de ces fonctions qui plante.
Oui, c'est bien la ligne trois qui pose problème mais ca compile sans soucis, c'est lors de l'exécution du programme que j'ai un message: segmentation fault. Toutes mes fonctions de base, à savoir mes constructeurs, destructeurs et les get et set sont fonctionnelles, j'ai déjà tout vérifié..
Le code fournit contient des erreurs, certainement dues à la recopie. Si on place les ';' au bon endroit rien ici ne provoquera un plantage, cela amène des doutes lors de la lecture. Je t'encourage donc à regarder à nouveau les fonctions, lancer le code en debug pour avoir plus d'infos, ou nous fournir plus de données sur ton code;
Ou bien les 3 à fois.
Ou bien les 3 à fois.
Bjr, une couleur est comprise entre 0 et 255.
Lorsque que tu construis un opérateur tu ne peux modifier les paramètres dans la fonction...
Il me sembe que les variables sont des constantes ...
Genre A=A+B
Lorsque que tu construis un opérateur tu ne peux modifier les paramètres dans la fonction...
Il me sembe que les variables sont des constantes ...
Genre A=A+B
Pas de soucis de ce coté étant donné que j'appelle une nouvelle classe, je ne modifie pas les constantes, J'ai réussi à régler le problème, je ne sais plus trop comment, voici le code tout de même:
Couleur Couleur::operator + (const Couleur &C1) { Couleur C2; char *Buffer= NULL; int Taille=0; C2.setRouge(this->getRouge()+C1.getRouge() < 255 ? this->getRouge()+C1.getRouge() : 255); C2.setVert(this->getVert()+C1.getVert() < 255 ? this->getVert()C1.getVert() : 255); C2.setBleu(this->getBleu()+C1.getBleu() < 255 ? this->getBleu()+C1.getBleu() : 255); Taille= (this->getNom() != NULL ? strlen(getNom()) : 1) + (C1.getNom() != NULL ? strlen(rC.getNom()) : 1) +2; if(this->getNom()!=NULL && C1.getNom()!=NULL) { Buffer= new char[Taille]; sprintf(Buffer,"%s-%s",this->getNom, C1.getNom }; } else { Buffer= new char (stren("Mélange inconnu")) strcpy(Buffer,"Mélange inconnu"); } C2.setNom(Buffer); return C2; }
Passer C1 par référence plutôt que par valeur est vraisemblablement ce qui a levé 'temporairement' ton problème (le constructeur par copie n'est plus appelé).
Attention , ton code n'est pas vraiment du C++ (strlen strcpy sprintf c'est du C).
La ligne 24 est certainement fausse.
Attention le nom est géré sous la forme d'un tableau alloué dynamiquement (ce qu'il faut à tout prix éviter à moins d'être expert). Tes constructeurs par copie, opérateur de copie et destructeur et ta fonction setNom() sont des fonctions complexes qui risquent de provoquer d'autre core dumps (voir The Big rule of three).
Pourquoi pas un nom sous la forme d'une std::string qui sait gérer automatiquement les allocations/déallocations nécessaires?
Attention , ton code n'est pas vraiment du C++ (strlen strcpy sprintf c'est du C).
La ligne 24 est certainement fausse.
Attention le nom est géré sous la forme d'un tableau alloué dynamiquement (ce qu'il faut à tout prix éviter à moins d'être expert). Tes constructeurs par copie, opérateur de copie et destructeur et ta fonction setNom() sont des fonctions complexes qui risquent de provoquer d'autre core dumps (voir The Big rule of three).
Pourquoi pas un nom sous la forme d'une std::string qui sait gérer automatiquement les allocations/déallocations nécessaires?
Oui, je sais bien que le nom est sous forme d'allocation dynamique, je les gère relativement bien, ça ne me pose pas de problèmes, toutes ces fonctions sont déjà tester et fonctionnent sans problème! C'est justement pour ça que j'utilise la bibliothèque string!
Encore un petit oubli de ; en recopiant le code pour la ligne 24 mais si non elle fonctionne.
Encore un petit oubli de ; en recopiant le code pour la ligne 24 mais si non elle fonctionne.
Yo,
Pour l'ajout de couleur, il me semble que cela doit être un Gradiant et pas une simple addition.
"Le calcul additif des couleurs (ou synthèse additive) est le calcul fait par addition des longueurs d'onde de sources lumineuses."
"Système Munsell
Dans cette représentation, les couleurs sont classées selon un réseau cylindrique basé sur 3 attributs perceptifs visuels à savoir :
• La teinte (en anglais hue) associée à la couleur rouge, vert, bleu ...
• La saturation (chroma) associée à l'aspect délavé ou non d'une couleur,
• La luminosité (value) associée à l'aspect sombre ou clair d'une couleur.
La réalisation pratique se fait sous forme d'un album imprimé dont chaque page correspond à une teinte uniforme"
"CIE xyY : propriétés
Mélange de couleur
Le mélange de la couleur C1 de longueur d’onde dominante λ1 et d’une couleur C2 de de longueur d’onde dominante λ2 donne une couleur d’onde C3 de de longueur d’onde dominante λ3"
Source
Pour l'ajout de couleur, il me semble que cela doit être un Gradiant et pas une simple addition.
"Le calcul additif des couleurs (ou synthèse additive) est le calcul fait par addition des longueurs d'onde de sources lumineuses."
"Système Munsell
Dans cette représentation, les couleurs sont classées selon un réseau cylindrique basé sur 3 attributs perceptifs visuels à savoir :
• La teinte (en anglais hue) associée à la couleur rouge, vert, bleu ...
• La saturation (chroma) associée à l'aspect délavé ou non d'une couleur,
• La luminosité (value) associée à l'aspect sombre ou clair d'une couleur.
La réalisation pratique se fait sous forme d'un album imprimé dont chaque page correspond à une teinte uniforme"
"CIE xyY : propriétés
Mélange de couleur
Le mélange de la couleur C1 de longueur d’onde dominante λ1 et d’une couleur C2 de de longueur d’onde dominante λ2 donne une couleur d’onde C3 de de longueur d’onde dominante λ3"
Source