laurentdav
Messages postés5Date d'inscriptionsamedi 11 avril 2009StatutMembreDernière intervention 9 août 2009
-
7 août 2009 à 11:09
laurentdav
Messages postés5Date d'inscriptionsamedi 11 avril 2009StatutMembreDerniè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;
}
A voir également:
Concatenation c
Concaténation en c - Meilleures réponses
Concatener deux chaine de caractere en c - Meilleures réponses
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 7 août 2009 à 12:32
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;
}