Soucis avec une classe CChaine [Résolu]

Signaler
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009
-
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009
-
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 defautCChaine(

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

#include

#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 =

new
char[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 =

new
char [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

//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

15 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

- 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
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

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
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

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
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

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
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

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
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

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
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

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
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

Qui va lentement va plus loin
CoolD
Merci jenaFrançois, ça fonctionne merci encore de tes conseils éclaairés
Il subsiste juste un petit souci quand l'utilisateur est dans le menu de création et qu'il choisit par erreur 1 chiffre entre 0 et 9 l'application lui dit bien d'introduire des nombres etntre 10 et 13 et se termine, or je pense qu'elle n'est pas obligée de quitter histoire de lasser à l'utlisateur la possibilité de réessayer ...

voila finalement le main

#include

"CChaine.h"#include

<stdexcept>#include

<limits>//pour std::limits#include

//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 et l'afficher " << std::endl

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

"2 - 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 > 2)std::cout <<

"veuillez choisir s.v.p une valeur entre 1 et 2" << 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 <<

"\n10 - 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 <<

"PRJ03 Class CChaine\n\n"<<

"Application permettant la gestion de chaines de caracteres"<< std::endl;

std::cout <<

"Que voulez-vous faire ?";

try{

int dChoix = 0;

while(dChoix != 2){

dChoix = Menu();

// on demande le choix de l'utilisateur

if(dChoix == 1){

int dCh_Create = 0;

char sTabMsg[100];
//

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);

oChaine1.Afficher();

//aficher la chaine }

break;

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

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

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

case 11:{

std::cout <<

"\nEntrer la chaine : " ;std::cin >> sTabMsg;

CChaine oChaine1(sTabMsg);

CChaine oChaine2(oChaine1);

oChaine2.Afficher();

//afciher la chaine }

break;

default:std::cout <<

"vous avec decide de quitter!!! au revoir \n" << std::endl;exit(0);

break;}

}

}

if(dChoix == 2){

std::cout <<

"\nVous avec decide de quitter au revoir!!!\n" << std::endl; }

}

}

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}

/* petit souci choix 1, choix 1 bug quitte application*/

/* petit souci quand on introduit 1 chiffre 0 entre et 9 */
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

Qui va lentement va plus loin
CoolD
Merci jenaFrançois, ça fonctionne merci encore de tes conseils éclaairés
Il subsiste juste un petit souci quand l'utilisateur est dans le menu de création et qu'il choisit par erreur 1 chiffre entre 0 et 9 l'application lui dit bien d'introduire des nombres etntre 10 et 13 et se termine, or je pense qu'elle n'est pas obligée de quitter histoire de lasser à l'utlisateur la possibilité de réessayer ...

voila finalement le main

#include

"CChaine.h"#include

<stdexcept>#include

<limits>//pour std::limits#include

//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 et l'afficher " << std::endl

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

"2 - 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 > 2)std::cout <<

"veuillez choisir s.v.p une valeur entre 1 et 2" << 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 <<

"\n10 - 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 <<

"PRJ03 Class CChaine\n\n"<<

"Application permettant la gestion de chaines de caracteres"<< std::endl;

std::cout <<

"Que voulez-vous faire ?";

try{

int dChoix = 0;

while(dChoix != 2){

dChoix = Menu();

// on demande le choix de l'utilisateur

if(dChoix == 1){

int dCh_Create = 0;

char sTabMsg[100];
//

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);

oChaine1.Afficher();

//aficher la chaine }

break;

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

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

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

case 11:{

std::cout <<

"\nEntrer la chaine : " ;std::cin >> sTabMsg;

CChaine oChaine1(sTabMsg);

CChaine oChaine2(oChaine1);

oChaine2.Afficher();

//afciher la chaine }

break;

default:std::cout <<

"vous avec decide de quitter!!! au revoir \n" << std::endl;exit(0);

break;}

}

}

if(dChoix == 2){

std::cout <<

"\nVous avec decide de quitter au revoir!!!\n" << std::endl; }

}

}

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}

/* petit souci choix 1, choix 1 bug quitte application*/

/* petit souci quand on introduit 1 chiffre 0 entre et 9 */
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

C'est normal les 2 menus n'ont pas la même structure ! Il suffit sue le menu de création est la même boucle de contrôle/saisie que le menu principal :

// =========================================================
// Affichage du menu
// lecture et vérification du choix de l'utilisateur
// Tant qu'input n'est pas 1 chiffre => ignoré
// Traitement du cas où le choix n'est pas dans l'intervalle
// retour du choix
// =========================================================
int Menu()
{
   std::cout << std::endl
             << "Veuillez choisir une des actions suivantes :" << std::endl
             << "   1 - Creer une nouvelle chaine " << std::endl
             << "   2 - Afficher la chaine " << std::endl
             << "   3 - Quitter" << std::endl
             << std::endl;
   int dChoix = 0;
   while (dChoix < 1 || dChoix > 3)
   {
      std::cout << "Votre choix ? ";
      while (!(std::cin >> dChoix))
      {
         std::cout << "*** Veuillez saisir 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 une valeur entre 1 et 3 ***" << std::endl;
   }
   return dChoix;
}






// ===================================================================
// Affichage du menu pour les différentes manières pour créer 1 chaine
// lecture et vérification du choix de l'utilisateur
// Traitement du cas où le choix n'est pas 1 chiffre => ignoré
// Traitement du cas où le choix n'est pas dans l'intervalle
// retour du choix
// ===================================================================
int MenuCreation()
{
   std::cout << std::endl
             << "   10 - Creer une nouvelle chaine avec le c'tor avec 1 parametre " << std::endl
             << "   11 - Creer une nouvelle chaine avec le c'tor par copie " << std::endl
             << "   12 - Quitter" << std::endl
             << std::endl;
   int dChoixCr = 0;
   while (dChoixCr < 10 || dChoixCr > 12)
   {
      std::cout << "Votre choix ? ";
      while (!(std::cin >> dChoixCr))
      {
         std::cout << "*** Veuillez saisir 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 une valeur entre 10 et 12 ***" << std::endl;
   }
   return dChoixCr;
}


Mais je trouve ces 2 menus vraiment compliqués pour un petit programme de test (surtout que je n'aime pas du tout les cin et cout !).



Jean-François
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

Qui va lentement va plus loin
CoolD
Merci encore, c'est vrai mon programme parait 1 peu compliqué du moins le main mais bon pour le moment, j e n'ai pas encore assez de connaissance et temps pour faire mieux, je le retravaillereai sans doutre car dans la suite du cours, il faudra ajouter de nouvelles fonctions membres à cette classe.
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Comme le retour de la longueur, c'est déjà dispo en interne !

   public:
   ...
   int GetLong(void) const { return m_dLong; }
   ...

Jean-François
Messages postés
12
Date d'inscription
vendredi 12 octobre 2007
Statut
Membre
Dernière intervention
23 août 2009

Qui va lentement va plus loin
CoolD
C'est juste, je lai ajoutée aujourd'hui d'ailleurs, Merci quand même