Concaténation de deux chaines de caractères par surchage d'opérateur [Résolu]

Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
9 août 2009
- - Dernière réponse : laurentdav
Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
9 août 2009
- 7 août 2009 à 13:42
Je n'arrive pas à surcharger l'opérateur + afin de concaténer deux chaîne de caractères au sein d'une classe. Il est à noter que je ne veux pas utiliser la fonction strcat.

Je vous remercie par avance.

Le code est le suivant:

#include <cmath>
#include <fstream>
#include

using namespace std;

class chaine
{
char * ch;int longueur;

public:
chaine(){longueur=0;ch=new char[1];}
chaine(char* cha){longueur=strlen(cha);ch=cha;}
chaine(const chaine & cha){longueur=strlen(cha.ch);ch=cha.ch;}
~chaine(){if (ch=="") delete [] ch;}
friend ostream & operator<<(ostream & os,const chaine & cha){os<<cha.ch<<endl;return os;}
chaine& operator =(const chaine & cha){ch=cha.ch;return *this;}
chaine operator + (const chaine& chb) const {
long i 0, j 0; // Création variable i et j.
for ( i=0 ; ch[i] != '\0' ; i++ );
do
{
ch[i] = chb.ch[j];
i++;
j++;
} while (chb.ch[j] != '\0');
long k = i + 1; // Sachant que k correspond à l'emplacement de fin de chaine.
ch[k] = '\0'; // On rajoute le caractère de fin de chaine à la suite de chaine.;}
return chaine(ch);}
};

int main(){
chaine c1("Bonjour");
chaine c2("a tous les 2");
chaine c3=(c1+c2);
cout<<c3;
return 0;
}
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
86
3
Merci
Une version propre et fonctionnelle de ce que tu as fait.
[list]
[*] using namespace std; => Oublie ça, c'est moche, et (beaucoup trop) souvent mal utilisé. En tout cas, à ne surtout pas mettre dans un .h !!!
[*] #include <cmath> => Inutile.
[*] char* chaine => Si tu ne touche pas à la chaine, préfère: const char* chaine.
[*] Sépare bien le header du code. On évite de coder dans la description de la classe.
[*] On met généralement une majuscule aux classes.
[*] On préfixe les attributs d'une classe, pour les différencier des arguments d'une méthode. Personnellement, j'utilise "_".
/list
Attention, n'oublie pas qu'assigner un pointeur est différent que de recopier la chaîne pointée !

#include <cstring>
#include <fstream>
#include 

class Chaine
{
  friend std::ostream& operator<<(std::ostream& os, const Chaine& chaine);

public:
  Chaine();
  Chaine(const char* chaine);
  Chaine(const Chaine& chaine);

  virtual ~Chaine();

  Chaine& operator=(const Chaine& chaine);
  Chaine operator+(const Chaine& chaine) const;

private:
  int _longueur;
  char* _chaine;
};

Chaine::Chaine()
  : _longueur(0), _chaine(new char[1])
{
  _chaine[0] = 0;
}

Chaine::Chaine(const char* chaine)
{
  _longueur = strlen(chaine);
  _chaine = strdup(chaine);
}

Chaine::Chaine(const Chaine& chaine)
{
  // Mieux vaut copier la chaine, que de simplement recopier le pointeur
  _chaine = strdup(chaine._chaine);
  _longueur = strlen(chaine._chaine);
}

Chaine::~Chaine()
{
  delete [] _chaine;
}

Chaine&
Chaine::operator=(const Chaine& chaine)
{
  // Mieux vaut copier la chaine, que de simplement recopier le pointeur
  _chaine = strdup(chaine._chaine);
  _longueur = strlen(chaine._chaine);
  return *this;
}

Chaine
Chaine::operator+(const Chaine& chaine) const
{
  long size = _longueur + chaine._longueur;
  char* tmp = new char[size + 1];

  for (long i = 0; i < _longueur; i++)
      tmp[i] = _chaine[i];
  for (long i = 0; i < chaine._longueur; i++)
      tmp[_longueur + i] = chaine._chaine[i];

  tmp[size] = 0;
  Chaine res(tmp);
  delete tmp;
  return res;
}

std::ostream&
operator<<(std::ostream& os, const Chaine& chaine)
{
  os << chaine._chaine;
  return os;
}

int main()
{
  Chaine c1("Bonjour");
  Chaine c2(" a tous les 2");

  Chaine c3 = c1 + c2;
  std::cout << c3 << std::endl;

  return 0;
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 186 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
5
Date d'inscription
samedi 11 avril 2009
Statut
Membre
Dernière intervention
9 août 2009
0
Merci
Merci beaucoup
Commenter la réponse de laurentdav