je pete les plombs la [C++] - Programmation
Marsh Posté le 21-02-2002 à 18:44:05
Tu as oublié le zéro terminateur de la chaine dans ta méthode getPile().
De plus cette méthode crée une chaine mais ne la libere pas donc ça va être à la charge de l'appelant de faire le delete.
Disons qu'il faut au moins changer le nom de la méthode.
Marsh Posté le 21-02-2002 à 18:48:20
Ah oui evite de mettre des valeur numerique tel "8". Le jour où tu veux changer cette limite, tu seras dans la merde. Utilise des constantes (statique ou enumeré ou parametre dans le constructeur)
le new char[m_iCount] n'est pas correct, il ne tient pas compte du zéro terminateur. Le proto ne sont pas complets (comme Vide() ou Pleine())
bool CPile::Vide() const par exemple
Marsh Posté le 21-02-2002 à 19:00:40
merci bcp pour ton aide
mais je ne comprends pas bien a quoi vont me servir les const devant pleine et vide ?
[jfdsdjhfuetppo]--Message édité par Rob Roy--[/jfdsdjhfuetppo]
Marsh Posté le 21-02-2002 à 19:31:11
Pour le const devant Vide ou Pleine, cela sert à dire que la fonction peut-etre appelée sur un objet constant : ie elle ne le modifie d'aucune facon. Ca a l'air de rien comme ca et ca te semble peut-etre inutile, mais prend l'habitude de mettre ce const absolument partout ou c'est possible. Sinon, tu auras des problemes plus tard avec les passages de paramètres par references et autres joyeusetés de ce genre
Marsh Posté le 21-02-2002 à 20:01:06
ex:
Code :
|
C'est une contrainte mais c'est
egalement une protection.
Evidemment c'est au programmeur de fixer
la semantique du const..
(rien ne t'interdit de definir Vide() const
et de changer l'etat interne de ton objet
dans ta methode)
Le passage par reference n'est pas toujours gagnant
a toi de voir si le surcout de copie de l'objet
(superficielle ou en profondeur)
surpasse le fait de devoir acceder
constamment a cet objet par un pointeur.
exemple: passer un simple entier par reference est
une idee stupide. Passer une matrice par reference
est plus intelligent. Mais parfois tu es tout
de meme oblige de copier ta matrice pour pouvoir faire
des operations dessus, donc autant la passer
par valeur la premiere fois. De meme le fait
de passer un entier par reference permet
de modifier la valeur de l'entier d'origine
depuis la fonction et donc la reference s'impose.
A+
LEGREG
Marsh Posté le 21-02-2002 à 18:28:22
voila je veux creer une pile toute simple de caractere
et obtenir ainsi tous les element de la pile de caractere dans une chaine de caractere. Ca a l'air simple. Je m'execute mais ce putain de compilateur me prend systematiquement dans ma chaine de caractere a la fin ²²²²... Pourtant j'ai pas l'impression que j'ai fait une erreur j'ai retourné le code dans tous les sens mais non il m'affiche toujours ce que je demande + les fameux ²²²².
je vous donne mon code
et vous remercie d'avance
ne vous souciez pas des #include
void main()
{
CPile P;
P.Empiler('0';
P.Empiler('1';
cout<<P.getpile()<<endl;
}
et la declaration de classe
class CPile
{
private:
char m_iPile[8];//Pile !!!
int m_iCount;//nb d'element ds la pile
public:
CPile(); //creer pile
bool Vide();//si vide
bool Pleine();//si pleine
char* getpile(); // obtenir la valeur de tous les elements de la pile
void Empiler(char c);
void Depiler();
};
//methodes de la classes CPile
CPile::CPile()
{
m_iCount=0;
}
bool CPile::Vide()
{
return (m_iCount==0);
}
bool CPile::Pleine()
{
return (m_iCount==8);
}
char* CPile::getpile()
{
char * temp;
temp = new char [m_iCount];
for (int i=0;i<m_iCount;i++)
temp[i]=m_iPile[i];
return temp;
}
void CPile::Empiler(char c)
{
m_iCount ++;
m_iPile[m_iCount-1]=c;
}
void CPile::Depiler()
{
m_iCount--;
}