Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : soucis avec une classe CChaine [ Divers / Débutant(e) ] (coolD)

dimanche 18 mai 2008 à 14:50:17 | soucis avec une classe CChaine

coolD

Qui va lentement va plus loin
CoolD
Bonjour à tous, je dois implémenter pour un exercice de classe une classe de chaine de carcatères. L'utilisateur doit pouvoir créér 1 chaine de plusieurs manières, prévoir les constructeurs appropriés.
NB: Les points theoriques vus sont: la notion de classe, de constructeurs par defaut et de copie, le début  du C++ en quelque sorte
voila ce que j'ai fait mais il ya des erreurs(danss le main) et je n'arrive pas à me corriger

fichier .h

#ifndef

CCAHINE_H

#define

CCHAINE_H

class

CChaine

{

public

:

CChaine(

void);//constructeur par defaut

CChaine(

char &psChaine);//constructeur avec 1 paramètres

CChaine(

const CChaine&);//constructeur par copie

void Affiche(void);//fonction d'affichage de la chiane de caractères

~CChaine(

void);//destructeur de la classe

private

:

// longueur de la chaine de caractere

int m_dLong;

//pointeur de la chaine de caractère

char *m_psTab;

};

#endif


fichier.cpp

#include

"CChaine.h"

#include

<iostream>

#include

<assert.h>

#include

<string.h>

//*************************

// constructeur par defaut

//*************************

CChaine::CChaine(

void)

:m_dLong(0)

,m_psTab(NULL)

{

}

//***********************

//constructeur par copie

//***********************

CChaine::CChaine (

const CChaine &oCh)

:m_dLong(0)

,m_psTab(NULL)

{

m_dLong = oCh. m_dLong;

m_psTab =

newchar[m_dLong + 1];

assert(m_psTab != 0);

strcpy(m_psTab , oCh.m_psTab);

}

//*****************************

//constructeur avec 1 paramètres

//*****************************

CChaine::CChaine(

char *psChaine)

:m_dLong(0)

,m_psTab(NULL)

{

m_dLong = strlen(psChaine);

m_psTab =

newchar [m_dLong + 1];

assert (m_psTab != 0);

strcpy(m_psTab , psChaine);

}

CChaine::~CChaine(

void)

{

delete[] m_psTab;

}

//*************************************************

// fonxtion d'affichage de la chiane de caractères

//*************************************************

void

CChaine::Affiche(void)

{

for(int dI = 0; dI < m_dLong; dI++)

std::cout << m_psTab[dI];

}

et le fichier main.cpp

#include

"CChaine.h"

#include

<stdexcept>

#include

<limits>//pour std::limits

#include

<iostream>

//using namespace std; aurait pemis de ne pas ecrire std::cout

//**********************************************************************************

//Implémenter une classe CChaine. Chaque objet de cette classe représente

//une chaîne de caractères. Avec cette classe, l'utilisateur doit être capable de :

//. créer une chaîne de plusieurs manières différentes

// --> quels constructeurs faut-il prévoir ?

//. Définition du constructeur par copie

//***********************************************************************************

int

Menu()

{

int dChoix = 0;

//-----------------------------------------------------------

// Affiichage du menu

// lecture et verification du choix de l'utlisateur

// Tant qu'input n'est pas 1 chiffre => ignoré

// Traitement du cas où le choix ,'est pas dans l'intervalle

// retour du choix

//-----------------------------------------------------------

std::cout <<

"Veuillez choisir 1 des actions suivantes :" << std::endl;

while(dChoix < 1 || dChoix > 3)

{

std::cout <<

"1 - creer une nouvelle chaine " << std::endl

<<

"2 - afficher la chaine " << std::endl

<<

"3 - quitter" << std::endl;

std::cout <<

"\nVotre choix ? ";

while(!(std::cin >> dChoix))

{

std::cout <<

"veuillez introduire s.v.p des chiffres uniquement..." << std::endl

<<

"Votre choix ?";

std::cin.clear();

std::cin.ignore(std::numeric_limits<std::streamsize>::max(),

'\n');

}

if(dChoix < 1 || dChoix > 3)

std::cout <<

"veuillez choisir s.v.p une valeur entre 1 et 3" << std::endl;

}

return dChoix;

}

int

MenuCreation()

{

int dChoixCr;

//----------------------------------------------------------------------

// Affiichage du menu pour les différentes manières pour créer 1 chaine

// lecture et verification du choix de l'utlisateur

// Traitement du cas ou le choix n'est pas 1 chiffre => ignoré

// Traitement du cas où le choix,n'est pas dans l'intervalle

// retour du choix

//----------------------------------------------------------------------

std::cout <<

"10 - creer une nouvele chaine avec le c'tor avec 1 parametre " << std::endl

<<

"11 - creer une nouvele chaine avec le c'tor par copie " << std::endl

<<

"12 - quitter" << std::endl;

std::cout <<

"\nVotre choix ? ";

while(!(std::cin >> dChoixCr))

{

std::cout <<

"veuillez introduire des chiffres uniquement..."<<std::endl

<<

"Votre choix ?";

std::cin.clear();

std::cin.ignore( std::numeric_limits<std::streamsize>::max(),

'\n' );

}

if(dChoixCr < 10 || dChoixCr > 12)

std::cout <<

"veuillez choisir s.v.p une valeur entre 10 et 12" << std::endl;

return dChoixCr;

}

 

int

main()

{

int dLong;

std::cout <<

"Class CChaine\n\n"

<<

"Application permettant la gestion de chaines de caracteres"

<< std::endl;

std::cout <<

"Que voulez-vous faire ?";

try

{

//CChaine oChiane1;

int dChoix = 0;

while(dChoix != 3)

{

dChoix = Menu();

// on demande le choix de l'utilisateur

switch(dChoix)

{

case 1:

int dCh_Create = 0;

char *sTabMsg;//

while(dCh_Create != 13)

{

dCh_Create = MenuCreation();

switch(dCh_Create)

{

//---------------------------------------------------------

//création de la chaine avec le construccteur à 1 paramètre

//---------------------------------------------------------

case 10:

std::cout <<

"entrer la chaine " ;

std::cin >> sTabMsg;

CChaine oChaine1(*sTabMsg);

break;

//-----------------------------------------------------

//création de la chaine avec le construccteur par copie

//-----------------------------------------------------

case 11:

std::cout <<

" Entrer la chaine " ;

std::cin >> sTabMsg;

CChaine oChaine1(*sTabMsg);

CChaine oChaine2(oChaine1);

break;

default:

break;

}

}

break;

case 2:oChaine1.Affiche();

break;

default:

break;

}

}

}

catch(std::bad_alloc &e)

{

std::cout <<

"une erreur est survenue lors de l'initialisation " << std::endl

<<

"il m'est impossible de continuer"<<std::endl;

return 1;//1 problème est survenu

}

return 0;//tout est ok

}



Merci d'avance

dimanche 18 mai 2008 à 16:22:46 | Re : soucis avec une classe CChaine

jfrancois

Bonjour,

1) Dans fichier.h :
- Orthographe de la constante de gestion des inclusionsmultiples :
  #ifndef CCHAINE_H
- Passage du pointeur avec const (la chaîne passée n'est pas modifiée) :
  CChaine(const char &psChaine);// constructeur avec 1 paramètre
- Fonction d'affichage de type const (elle ne modifie pas les attributs de la classe) :
  void Affiche(void) const// affichage de la chaîne de caractères

2) Dans fichier.cpp :
- Fonction Affiche() : La chaîne stockée est de type C avec son terminateur donc pas besoin de cette boucle !   std::cout << m_psTab;  suffit, et même if (m_psTab) std::cout << m_psTab; pour ne pas planter avec une instance sans chaîne comme dans le test dans le main().

3) Dans main.cpp :
- Le buffer de saisie des chaînes n'existe pas ! ce n'est qu'un pointeur : char sTabMsg[100];
- Passage de la chaîne créée en paramètre : oChaine1(sTabMsg);
- Vue la façon dont les instances de CChaine sont créées, Affiche() ne peut rien faire là où il est !

Jean-François


dimanche 18 mai 2008 à 19:35:50 | Re : soucis avec une classe CChaine

vecchio56

Administrateur CodeS-SourceS
Pour le constructeur, je pense qu'il faut CChaine(const char *psChaine); au lieu de CChaine(const char &psChaine);

(Il y a incohérence dans l'exemple posté au départ entre la définition et la déclaration de ce constructeur, qui n'ont pas la même signature)

_____________________________________
Un éditeur de ressources gratuit pour Windows


dimanche 18 mai 2008 à 22:19:27 | Re : soucis avec une classe CChaine

coolD


Qui va lentement va plus loin
CoolD
Merci des réponses, en fait dans la déclaration de la classe, j'ai prévu 1 constructeur avec 1 paramètre et c'est vari autant le déclarer en constant, mais faut il mettre en reféence(CChaine(const char &psChaine);// constructeur avec 1 paramètre)

Pour la fonction d'affichage
"std::cout << m_psTab;  suffit, et même if (m_psTab) std::cout << m_psTab; pour ne pas planter avec une instance sans chaîne comme dans le test dans le main()"
je ne suis pas sur de bien comprendre la remarque.

Dans le lmain
je ne sais pas ce qui coince au niveau de la ligne du  case 11:

error C2360: l'initialisation de 'oChaine1' est ignorée par l'étiquette 'case'

CChaine oChaine1(sTabMsg):

error C2374: 'oChaine1' : redéfinition ; initialisation multiple

la ligne avec default:

error C2361: l'initialisation de 'oChaine2' est ignorée par l'étiquette 'default'


la ligne du case 2:

error C2360: l'initialisation de 'dCh_Create' est ignorée par l'étiquette 'case'

la ligne de default:

error C2361: l'initialisation de 'dCh_Create' est ignorée par l'étiquette 'default'


Merci
CoolD

dimanche 18 mai 2008 à 22:19:28 | Re : soucis avec une classe CChaine

coolD


Qui va lentement va plus loin
CoolD
Merci des réponses, en fait dans la déclaration de la classe, j'ai prévu 1 constructeur avec 1 paramètre et c'est vari autant le déclarer en constant, mais faut il mettre en reféence(CChaine(const char &psChaine);// constructeur avec 1 paramètre)

Pour la fonction d'affichage
"std::cout << m_psTab;  suffit, et même if (m_psTab) std::cout << m_psTab; pour ne pas planter avec une instance sans chaîne comme dans le test dans le main()"
je ne suis pas sur de bien comprendre la remarque.

Dans le lmain
je ne sais pas ce qui coince au niveau de la ligne du  case 11:

error C2360: l'initialisation de 'oChaine1' est ignorée par l'étiquette 'case'

CChaine oChaine1(sTabMsg):

error C2374: 'oChaine1' : redéfinition ; initialisation multiple

la ligne avec default:

error C2361: l'initialisation de 'oChaine2' est ignorée par l'étiquette 'default'


la ligne du case 2:

error C2360: l'initialisation de 'dCh_Create' est ignorée par l'étiquette 'case'

la ligne de default:

error C2361: l'initialisation de 'dCh_Create' est ignorée par l'étiquette 'default'


Merci
CoolD

dimanche 18 mai 2008 à 22:28:56 | Re : soucis avec une classe CChaine

jfrancois

je ne sais pas ce qui coince au niveau de la ligne du  case 11:
error C2360: l'initialisation de 'oChaine1' est ignorée par l'étiquette 'case'

Il faut mettre le contenu d'un case entre {} quand il y a une/des variable(s) déclarée(s) dans le case :

case 10:
std::cout <<
"entrer la chaine " ;
std::cin >> sTabMsg;
CChaine oChaine1(*sTabMsg); <-- déclaration dans le case (* en trop ici)
break;

case 11: <-- ERREUR C2360

il faut :

case 10:
{
   std::cout <<
"entrer la chaine " ;
   std::cin >> sTabMsg;
   CChaine oChaine1(sTabMsg); <-- (* enlevée)
}
break;

case 11: <-- PLUS D'ERREUR C2360

Jean-François


dimanche 18 mai 2008 à 22:46:15 | Re : soucis avec une classe CChaine

jfrancois

1) "Pour la fonction d'affichage std::cout << m_psTab;  suffit, et même if (m_psTab) std::cout << m_psTab; pour ne pas planter avec une instance sans chaîne comme dans le test dans le main()"
je ne suis pas sur de bien comprendre la remarque.

La chaîne de caractères stockée dans une instance de la classe CChaine est du type chaîne C, c'est à dire que c'est un tableau de caractères terminé par un zéro binaire (si ça n'était pas le cas, elle ne serait pas copiée avec des strcpy() dans les constructeurs). Donc elle peut être sortie par un simple cout << chaîne ! Celà ne sert à rien de faire une boucle sur les caractères de la chaîne. MAIS si le pointeur m_psTab est à NULL alors cette sortie va provoquer un plantage, d'où la protection avec le test du pointeur :

void CChaine::Afficher(void) const
{
   if (m_psTab) std::cout << m_psTab;
}


2) Dans le constructeur avec une chaîne de caractères, il faut effectivement la mettre en pointeur et non en référence :

CChaine::CChaine(const char* psChaine) : m_dLong(0),m_psTab(NULL)
{
   if (psChaine == NULL) return; // protection !
   m_dLong = strlen(psChaine);
   m_psTab = (char*)new char[m_dLong + 1];
   assert(m_psTab != NULL);
   strcpy(m_psTab,psChaine);
}

Jean-François


dimanche 18 mai 2008 à 23:35:55 | Re : soucis avec une classe CChaine

coolD


Qui va lentement va plus loin
CoolD
Effectivement en mettant le contenu du case entre accolades les erreurs disparaissent, je ne connaissais pas bien ce detail du case.
Une erreur persiste dans les case 2  

case

2:oChaine1.Afficher();

ce qui est normal car la variable oChaine n'est pas déclarée, comment remédier à ce problème en demandant par exemple la chaine qui aurait été créée précédemment.
Tu me faisais la remrque précédemment mais javis pas vu le pb mais là je le vois et en  suis conscient  parce que même en ecrivant ceci le problème n'est pas résolu 

case

2:

{

CChaine oChaine1, oChaine2;

oChaine.Afficher();

}

break;
as-tu 1 idée sur comment résoudre cette difficulté?
 merci coolD

dimanche 18 mai 2008 à 23:46:16 | Re : soucis avec une classe CChaine

jfrancois

Réponse acceptée !
- Soit il faut afficher derrière les créations de chaînes (en 10 et en 11) et l'oter du menu,

- Soit il faut ajouter la surcharge de l'assignation (operator =) et transférer chaque chaîne créée (en 10 et en 11) dans la chaîne accessible depuis le choix "Afficher".

Jean-François


lundi 19 mai 2008 à 00:00:52 | Re : soucis avec une classe CChaine

coolD



Qui va lentement va plus loin
CoolD
Je pensais à la 1a option ,  je pense à mon niveau c'est la meilleurs option.
J'essaie ça merci et je tiens au courant
merci


1 2

Cette discussion est classé dans : chaine, cout, std, cchaine, pstab


Répondre à ce message

Sujets en rapport avec ce message

calcul d'un modulo [ par cabarrus ] Qui peu m'aidé s.v.p pour ce problème...Ecrire un prog qui demande 2 nbres à l'utilisateur et qui affiche le reste de la division du 1er par le second comparation chaine de caractere [ par SfyLer ] prise de tête j'arrive pas a comparer de chaine de caractere:#include #include char main(void){ char login[6]; cout cin >> login; cout << "\n";<b problème de fermeture de fichier [ par RubikEID ] Salut à tous.Après pas mal de recherche je n'ai pas à réussi à trouver de réponse.je suis confronter au problème suivant : je veux effectue la recherc 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 .. Rediriger le flux cout vers une chaine [ par tanguy_laverdure ] Bonjour,J'utilise la méthode ci-dessous pour afficher dans la fenetre console des informations.void __fastcall Solution::Affiche(){ cout cout <&l dur d'apprendre c++ [ par busta74 ] je dois ecrire un programme qui exploite des fonction individuelles pour demander l'age, lire cet age saisi au clavier , et utiliser cette valeur pour problème de chaine de caractères (débutant) [ par graall ] salut à tous, j'ai un gros problème avec ce code : (le problème est expliqué dans les commentaires)     FILE *pReference = fopen(reference_path, "r") ajout d'une chaine à une autre [ par mathieu57100 ] j'ai la fonction main suivante mais le réusltat ne donne pas ce que je voudrais... int main(void){    /*Affiche la date et l'heure*/    time_t t;    t compilation .o [ par xantro ] bonjour a tous et a toutes. J'aurai besoin d 'un coup de main pour un probleme de compilation. Voila, j'ai mon programme avec plusieurs fichiers (fic Problème de compilation [ par killer75 ] Voici donc mon pb:helpers.h #ifndef _HELPERS_H# define _HELPERS_H#include long strToLong(std::string const &a, int b);long strToLongDef(std::stri


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,655 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.