Surcharge d'opérateur (opérateur+)

Résolu/Fermé
aure2015 - Modifié le 20 oct. 2017 à 13:53
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 - 26 oct. 2017 à 09:46
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:
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.

4 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
20 oct. 2017 à 13:50
La 3ième ligne dans le corps du
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.
0
aure2015 Messages postés 93 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 30 mai 2020 5
20 oct. 2017 à 15:04
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é..
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
20 oct. 2017 à 18:50
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.
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
Modifié le 23 oct. 2017 à 20:45
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
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
Modifié le 23 oct. 2017 à 20:52
Couleur operator+(Couleur const& a, Couleur const& b)
{
Couleur resultat;
// Calcul des valeurs des attributs de resultat
return resultat;
}
0
aure2015 Messages postés 93 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 30 mai 2020 5 > Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019
24 oct. 2017 à 12:13
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;
}
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > aure2015 Messages postés 93 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 30 mai 2020
24 oct. 2017 à 18:37
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?
0
aure2015 Messages postés 93 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 30 mai 2020 5 > Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023
24 oct. 2017 à 19:03
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.
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 208
Modifié le 26 oct. 2017 à 10:42
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
0