begin process at 2012 05 28 07:21:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

allocation mémoire dans une classe


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

allocation mémoire dans une classe

vendredi 14 mars 2008 à 21:39:25 | allocation mémoire dans une classe

M_didi

Bonjour,
voilà je suis bloquée alors je vais mettre l'énoncé de tout ce que je veux faire. Je suis débutante.

Voilà, je souhaite écrire une classe Chaine qui me permet de manipuler et de créer une chaine de caractères.

Dans cette classe Chaine j'ai deux propriétes:

- longueur de ma chaine (entier)
- adresse d'une zone allouée dynamiquement(pointeur sur caractères)

Ensuite, voici mes méthodes:

-chaine() qui initialise une chaine à vide
-chaine(char *) qui initialise la chiane passée en argument
-operator =
-operator ==
-operator + qui permet de concaténer deux chaines de caractères
-operator[] qui permet d'accéder à un caractère de rang donné par une chaine de caractère
-affiche () qui permet l'affichage d'une chaine de caractères

Voici ce que j'ai commencé en prenant note des critiques:

#include <iostream>

class Chaine
{
private :

int m_longueur;
char *m_allouee;

public :

//constructeurs et destructeurs
Chaine();
Chaine( char * texte );
~Chaine();

//opérateurs
void operator=( Chaine & ch );
int operator== (Chaine );
Chaine operator+ (Chaine ch );
char operator[](int i );
void affiche();


};

//constructeur par défaut
Chaine::Chaine()
{
m_longueur = 0; // taille de base
m_allouee = new char[ m_longueur ];
}


//Chaine::Chaine(char *texte)//constructeur2
//{
//
//
//}

void Chaine::operator = (Chaine &ch)
{
m_longueur = ch.m_longueur;
m_allouee = ch.m_allouee;

}

int Chaine::operator == (Chaine ch)
{
m_longueur = ch.m_longueur;
m_allouee = ch.m_allouee;
}

Chaine Chaine::operator +(Chaine ch)
{
Chaine resultat; // création de l'objet résultat
resultat.m_longueur = m_longueur + ch.m_longueur;
resultat.m_allouee = ch.m_allouee;
return resultat;
}

char Chaine::operator [] (int i)
{
}


//destructeur
Chaine::~Chaine()
{
delete[] m_allouee;
}


void Chaine::affiche()
{
cout <<"La longueur de la chaine est de :" << m_longueur << endl;
}


int main()
{

Chaine a ("Bonjour"), b("Maria") , c,d ("Bonjour"),e;

if(a==b) cout <<"Gagne !\n";
else cout <<"Perdu ! \n";
if(a==d) cout <<"Gagne !\n";
else cout <<"Perdu ! \n";

cout <<"a:";
a.affiche();
cout <<"b:";
b.affiche();
cout <<"d:";
d.affiche();
c = a+b;
cout <<"c:";
c.affiche();

for(int i=0; c !='\0'; i++)

cout << c;
system("pause");
return 0;

}


Le problème c'est que je n'arrive pas à remplir mon deuxième constructeur. Je ne sais pas s'il est bon ou pas

Ensuite pour l'operator [](int i) je ne vois pas comment procéder ni pour void Chaine::operator = (Chaine &ch)

Merci de prendre le temps de m'aider.
vendredi 14 mars 2008 à 22:41:13 | Re : allocation mémoire dans une classe

gamemonde

Membre Club

donc ton 2er constructeur donnerai

CChaine::CChaine(char pChaine)
{
    int iSize = strlen(pChaine) // ou creer ta propre methode pour le pas utilisé de fonction externe
    if (iSize > 0)
   {
          m_longueur = iSize ;
          m_allouee = new char[iSize];

          for (int i=0; i < iSize; i++)
          {
                   m_allouee[i] = pChaine[i];
           }
    }
}

void CChaine::operator = (CChaine &ch)
devrais etre
CChaine & CChaine::operator = (const CChaine &ch);
tu retourne simplement (*this)

ton operator == selon la norme parle d',operateur binaire soit est egual à , donc devrai retourné un bool et dans ta mthode elle devrais detecter si la chaine est pareil à un autre

samedi 15 mars 2008 à 09:19:25 | Re : allocation mémoire dans une classe

M_didi

Bonjour,
merci de m'aider. Comme je débute, j'aimerais savoir dans le 2ème constructeur à quoi correspond pChaine. Est-ce un pointeur ? J'ai donc fait cela avec comme paramètre *texte. Mais je ne sais pas si cela est bon :

Chaine::Chaine(char *texte)
{
    int iSize = strlen(texte);
    if (iSize > 0)
   {
          m_longueur = iSize ;
          m_allouee = new char[iSize];

          for (int i=0; i < iSize; i++)
          {
                   m_allouee[i] = texte[i];
           }
    }
}

Je retravaille mes autres méthodes et je reposte après pour une vérification.Merci encore.
samedi 15 mars 2008 à 15:19:43 | Re : allocation mémoire dans une classe

SAKingdom

Membre Club
Il manquera le 0 de fin dans chaine.
J'aurais fais quelque chose comme ceci:

Chaine::Chaine(char *texte)
{
    int iSize = strlen(texte);
    if (iSize > 0)
   {
          m_longueur = iSize ;
          if((m_allouee = new char[iSize+1])) {
              char *c = m_allouee;
              while((*c = *texte)) {
                 c++;
                 texte++;
              }
          }
    }
}

Au passage, il faut TOUJOURS vérifier que la mémoire a bien été allouée. Aussi, il faut une place supplémentaire dans ton buffer pour le 0 de fin de chaine.
Finalement, quand on met des classes en paramètre, il faut prendre l'habitude de passer une référence vers cette classe. Sinon, chaque appel à la méthode génèrera un appel au constructeur de copie.

Pour ton l'operateur [](int i), suffis de prendre i comme index de ton tableau et retourner le char correspondant sous forme de référence ou non, à toi de voir.

L'opérateur == devrait servir à comparer les chaines. strcmp.

Tes opérateurs + et = causeront bien des problèmes. En effet, tu ne fais que faire pointer l'attribut this.m_allouee sur sont correspondant dans l'autre classe.
Quand l'autre classe libèrera sa mémoire, les pointeurs deviendrons invalides. De plus, les classes qui pointent désormais sur des zones invalides libèrerons aussi leur mémoire... crash en perspective.

Pour ton opérateur =, peut-être faudrait il faire, à la place, un constructeur de copie.

Pour ton opérateur +, il faudra concaténer le contenue de ch.m_allouee dans this.m_allouee. Pour ça, faudra faire un nouveau buffer ayant la taille de this.m_longueure + ch.m_longueure puis copier le contenue de l'ancien buffer dans le nouveau buffer avant de détruire l'ancien. Grosse perte de temps mais c'est comme ça avec l'objet.

C++ (@++)

samedi 15 mars 2008 à 16:29:51 | Re : allocation mémoire dans une classe

M_didi

Bonjour,

 Je vais retravaillais en prenant note de ces commentaires. C'est sympa de prendre le temps de m'expliquer.
Merci infiniment
  



Cette discussion est classée dans : chaine, cout, longueur, operator, allouee


Répondre à ce message

Sujets en rapport avec ce message

Squelette erroné ?! [ par Spolixjo ] Bonjour, J'ai reçu un exercice niveau 1ère année BTS IRIS qui consiste à compléter ce squelette ci-dessous. Je souhaiterai avoir l'avis d'une person surcharge operator << [ par elninodu42 ] Bonjour, Je dois trouver une solution permettant d'afficher dans un flux de chaine. Je ne peux pas utiliser de string... Je dois donc faire une surc Concaténation de deux chaines de caractères par surchage d'opérateur [ par laurentdav ] 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 utilis taille d'une chaine extraite d'un fichier [ par aymen87 ] Bonjour Je suis en train de lire à partir d'un fichier ligne par ligne en utilisant fgets, mais avec fgets je doit introduire la longueur maximale d Problème avec les classes filles [ par gdefrance ] Bonjour à tous, j'ai un problème avec une classe fille en C++, la classe mère chaine détient ses constructeurs et tout marche bien, mais avec la clas soucis avec une classe CChaine [ par coolD ] Qui va lentement va plus loinCoolDBonjour à tous, je dois implémenter pour un exercice de classe une classe de chaine de carcatères. L'utilisateur doi Déconcertant ! :( [ par Zeroc00l ] -={[ Zeroc00l ]}=-Bon j'ai apris recement a faire du C++cout affiche du texte une fois inclus iostream.h scanf recupere des valeur saisie a l'ecran .. Longueur chaine de caractère en C/C++ [ par Folcoche ] Bonjours,Je dois réaliser le jeu du pendu en Console windows, a partir du logiciel Dev C++.Je bute sur une soucis de longueur de chaine de caractère.V c++ [ par zizota ] bonjour,j'ai un tp pour implémenter l'algorithme de hachage md5 en c++.Je suis débutante en c++.Je doit écrire une classe qui permet de:    -ajouter u surcharge stream operator [ par Joan_Andre ] Bonjour,Quelqu un pourrait il m expliquer la raison pour laquelle le code ci dessous ne fonctionne pas (je ne parviens pas a faire "entrer" le std::en


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales