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

Résolu
aure2015 -  
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:
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   Statut Membre Dernière intervention   101
 
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   Statut Membre Dernière intervention   5
 
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   Statut Membre Dernière intervention   101
 
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   Statut Membre Dernière intervention   209
 
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   Statut Membre Dernière intervention   209
 
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   Statut Membre Dernière intervention   5 > Fallentree Messages postés 2309 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   101 > aure2015 Messages postés 93 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   5 > Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   209
 
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