|
Dernière réponse | |
---|---|
Sujet : [Help] Acquis de conscience en c++ ? | |
Rob Roy | ca a l'air ok
je te remercie pour ta patience :) |
Aperçu |
---|
Vue Rapide de la discussion |
---|
Rob Roy | ca a l'air ok
je te remercie pour ta patience :) |
LeGreg | le std c'est juste pour dire que cin et cout sont definis dans l'espace de nom std Tu peux eviter de preciser l'espace de nom a chaque fois en mettant une fois pour toute au debut de ton fichier using namespace std; par contre je ne vois pas ou tu as mis ton #include <iostream> c'est le fichier qui contient les definitions de cin et cout A+ LEGREG |
LeGreg | quand je disais qu'un tableau ca va de 0 a taille-1
taille c'est la taille du tableau et il faut donc faire un tableau = new short[taille]; <-- cree un tableau a taille element numerotes de 0 a taille-1 LEGREG |
Rob Roy | svp :cry: :cry: |
Rob Roy | au fait il sort d'ou le std |
Rob Roy | merci pour qui ya en haut
euh j'ai tout mis je remet tout ds un post if y like class CLigne { friend class CMatrice; private : short* m_lpsLigne; bool m_bOnly0; public : CLigne(); void Saisir(int taille); void Afficher(); void Ajouter(CLigne L); ~CLigne(); }; CLigne::CLigne() { m_lpsLigne=NULL; m_bOnly0=true; } void CLigne::Saisir(int taille) { m_lpsLigne = new short [taille-1] ; for (int i=0;i<=taille-1;i++) { cin >> m_lpsLigne[i]; } } CLigne::~CLigne() { delete [] m_lpsLigne; } void main() { CLigne P; P.Saisir(2); } |
LeGreg |
|
Rob Roy | snif ... |
Rob Roy | en passant ya t'il un moyen d'empecher l'utilisateur de taper autre chose qu'un int ou un short dans un cin ou encore un moyen de tester les valeur que l'utilisateur rentre ? |
Rob Roy | class CLigne
{ friend class CMatrice; private : short* m_lpsLigne; bool m_bOnly0; public : CLigne(); void Saisir(int taille); void Afficher(); void Ajouter(CLigne L); ~CLigne(); }; |
LeGreg | ben tu as l'air de savoir la ou ca plante
malheureusement je crois qu'il nous manque encore du code => pourquoi ne pas nous donner au moins toute l'implantation de CLine? J'imagine egalement que le "1"devant la declaration de "~CLigne()" est une erreur de copier-coller.. LEGREG |
Rob Roy | personne ? :cry: :cry: :cry: |
Rob Roy | nop ca suffit car le prog plante quand mon main a =>
void main() { CLigne P; P.Saisir(2); } ridicule quoi |
LeGreg | j'crois qu'il faut que tu rajoutes encore
un bout de ton programme.. LEGREG |
Rob Roy | merci pour ce ptit detail que j'avais oublié nmais ca marche pas mieux, car en fait meme si mes tableaux etait plus grand que la normal (...) l'espace etait quand meme alloué et le probleme reste le meme ! |
LeGreg | ca marche pas mieux avec 0 et taille-1??
LEGREG |
Rob Roy | up |
LeGreg |
|
Rob Roy |
[edtdd]--Message édité par Rob Roy--[/edtdd] |
LeGreg | essaie de poster le code complet du truc
ou un exemple simple qui plante j'crois qu'il nous manque du materiel pour juger.. LEGREG |
Rob Roy | oui j'en suis certain !
mon main pour le test est Ligne P; P.Saisir(2); P.Afficher(); et c tout et il trouve le moyen de me foutre une erreur qund je fais un delete [] ligne ds le constructeur ! |
LeGreg |
|
El_gringo | ...bah, changer le nom de ton membre !!
d'ailleur normalement, on préfixe les attributs de classe par m_, puis une lettre qui indique le type du membre. Si ton prog était écrit selon les normes, ça donnerai m_lpsLigne. lp signifiant qu'il s'agit d'un pointeur |
Rob Roy | ok je viens de capter
oui c ca et je pense (suis presque sur) que le probleme vient de la et je cherche en faite la technique pour contourner ce prob |
Rob Roy | ben logiquement non car le tableau de short ligne est en minuscule et la classe Ligne est en majuscule (je parle du "L" ) donc il s'agit de 2 chose differente |
El_gringo | un truc possible : ton membre ligne appartient à la classe Ligne ... peut être qu'il aime pas trop ça ! |
Rob Roy | merci pour tout ca, mais cela n'arrange pas mon affaire, car le fait de detruire une objet membre ds le destructeur , voir meme ailleurs pose des problemes (ERROR / DAMAGE ...)
je vous pose ma class class Ligne { private : short* ligne; ... public : Ligne(); void Saisir(int taille); ... ~Ligne(); }; quand je saisis un objet de Ligne je fais a l'interieur un ligne = new short [taille] ; donc je renseigne la donnée membre ligne mais si je met ds le destructeur ou meme ailleur un delete [] ligne ou meme un free(ligne) (qUI n'appelle pas le destructeur) j'ai un gros message d'erreur quoi faire pour dessalouer cette !!!! de memoire ? |
LeGreg | Le destructeur n'est appele que dans les cas suivants:
- tu arrives a la fin du scope de ton objet (alloue sur la pile => destruction automatique en fin de procedure, objet membre => destruction automatique a la destruction de l'objet qui le contient, allocation globale => destruction a la sortie de l'application) - tu appelles delete sur cet objet (si celui-ci a ete prealablement alloue par new). Quand je dis "objet membre" cela exclut bien evidemment les pointeurs et les references. Dans ce cas, il faut definir QUI doit detruire les objets pointes ou references. C'est a toi de definir ta convention, mais il faut s'y tenir strictement parce que chaque objet ne peut etre detruit qu'une seule fois (sinon plantage!). A+ LEGREG |
El_gringo |
|
SoWhatIn22 | hello,
quand tu fais une allocation dynamique, c'est TOUJOURS à toi de faire la désallocation (sauf pour certaines API très particulières dont on ne parlera pas ici). Les détruire explicitement dans le detructeur me semble une bonne idée ;) Personnellement, quand je fait une désallocation, je mets TOUJOURS ensuite le pointeur à NULL. Et donc dans le destructeur, tu peux faire un if(ptr != NULL) { delete [] ptr; ptr = NULL; } A priori cela ne coute pas grabd chose. Par contre attention, car si tu utilises ce tableau dans une autre classe et que la classe qui l'a crée, il peut y avoir un soucis :D Attention donc de ne pas utiliser le tableau une fois qu'il a été détruit :D a+ |
Rob Roy | je créé une classe composé ayant comme donnée membre un tableau dynamique et d'autres trucs
a chaque fois que je créé un objet de cette classe je 'alloue (new ...) donc ce tableau dynamique pour le reutiliser plus tard ds une autre classe. Ma question concerne en realité le destruceur. Dois-je desallouer par delete les tableaux que je créé, a la fin de mon programme, ou le destructeur se charge t'il de le faire pour moi. Sinon comment faire ? Merchi ++ |