coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009
-
18 mai 2008 à 14:50
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009
-
21 mai 2008 à 01:12
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
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 18 mai 2008 à 23:46
- 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
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 18 mai 2008 à 16:22
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 !
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009 18 mai 2008 à 22:19
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'
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009 18 mai 2008 à 22:19
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'
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 18 mai 2008 à 22:46
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 :
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009 18 mai 2008 à 23:35
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
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009 19 mai 2008 à 00:00
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
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009 19 mai 2008 à 01:11
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
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009 19 mai 2008 à 01:11
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
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 19 mai 2008 à 01:33
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 !).
coolD
Messages postés12Date d'inscriptionvendredi 12 octobre 2007StatutMembreDernière intervention23 août 2009 19 mai 2008 à 15:18
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.