référent pointeurs alias - C++ - Programmation
Marsh Posté le 18-01-2005 à 23:40:44
Code :
|
Marsh Posté le 18-01-2005 à 23:51:32
Marsh Posté le 18-01-2005 à 23:53:59
en principe il est interdit d appeler explicitement le destructuer via ~TaClasse().
Utilise plutot "delete"
Si ton pointeur est NULL (comme ici) il est normal que l'appel à ~TaClasse() plante...
delete ne plantera pas si ton pointeur est nul.
Marsh Posté le 19-01-2005 à 00:35:20
PtitKiki a écrit : en principe il est interdit d appeler explicitement le destructuer via ~TaClasse(). |
j'aimerais que ptr puisse pointer mon objet Societe.
est-ce comme ceci?
CSociete *ptr=Societe ;
ou comme ceci?
CSociete *ptr=ptrSociete;
????
puis mes 2 objets ici en dessous
CSociete *ptrSociete=new CSociete();
CSociete Societe;
et mon pointeur
CSociete *ptr;
faut que ptr puisse pointer ce que pointe ptrSociete ou qu'il pointe Societe.
ceci fonctionne ptr->~CSociete(); en tout cas.
mon but est d'avoir 2 référents pour un objet pour les 2 manieres de création d'objet
c'est vraiment ca le principal
donc on fait ca comment svp? please ne me pointez pas..
Marsh Posté le 19-01-2005 à 00:48:02
ça va pas la tête d'appeler le destructeur explicitement !
Marsh Posté le 19-01-2005 à 00:49:49
et pourtant ca marche tranquillement ! sans aucune erreur m'enfin
il parait que ca fait des "trous non réutilisables" fragmentation dans la RAM en c++
et que java lui par contre "défragmente la ram".
Marsh Posté le 19-01-2005 à 00:53:32
c'est sur qu'en codant ainsi, tu vas pas te faire beaucoup d'amis...
Marsh Posté le 19-01-2005 à 00:54:09
mon but est d'avoir 2 référents pour un objet pour les 2 manieres de création d'objet
c'est vraiment ca le principal
donc on fait ca comment svp?
bon dans un diagramme de séquence on peut mettre fin à la vie d'un objet explicitement en y faisant une belle croix sur sa ligne de vie
alors bon
Marsh Posté le 19-01-2005 à 00:56:20
on joue pas avec les pointeurs si on sait pas ce que c'est
Marsh Posté le 19-01-2005 à 00:58:32
bah je sais ce que c'est
c'est une variable qui recoit une adresse ...
et après quoi?? keskil reste a savoir pour "jouer avec" comme tu dis?
je sais très bien qu'il faut faire un delete plutot qu'un appel au destructeur !!
mais rho c'est pas pour ca que je suis venu poster un sujet !
faut savoir que je ne voulais pas détruire l'objet! j'ai pris le destructeur paske c'était la seule "chose" que je pouvais encore prendre pour tester mon pointeur.
En fait étant donné que je ne pouvais plus appeller le constructeur
et que j'avais la flegme de taper une autre fonction il restait devant mes yeux uniquement le destructeur a employer !pour tester si mon pointeur pointait bien l'objet que je voulais lui faire pointer !!
mais je le répete meme si j'ai fait une grosse bétise en appellant le destructeur a l'aide d'un pointeur
mon but était d'avoir deux référents pour un objet créé dynamiquement et 2 référents pour un objet créé statiquement.
voila !!
Marsh Posté le 19-01-2005 à 01:02:07
bon bin alors ?
avec un peu de jujote, tu dois trouver tout seul
Marsh Posté le 19-01-2005 à 01:07:53
donc
CSociete Societe;
CSociete *ptr;
ici Societe est un objet on est ok jusque la
ensuite le mot Societe c'est un référent
jusque la on est toujours ok
maintenant on sait tous qu'un référent c'est un pointeur !
donc ca fait DEJA un pointeur nommé Societe qui pointe vers une zone mémoire ou est stocké l'objet.
alors justement si on est d'accord jusque la
comment faire pour que *ptr puisse pointer la meme chose que ce que pointe le pointeur qu'est Societe??
doit on faire *ptr=Societe ou bien *ptr= &Societe?
je ne comprend pas pourquoi on peut faire Societe.fonction()
et que l'on peut tout aussi bien faire ptrSociete->fonction()
qu'est ce qui change a part l'appel?
Marsh Posté le 19-01-2005 à 01:12:09
toi t'as pas écouté au cours...
PS : Taz, regarde pas ca, sinon tu vas faire une attaque...
Marsh Posté le 19-01-2005 à 01:13:33
en fait je crois que je confond....
quand on passe un objet a une fonction
pas besoin de mettre un & devant car c'est déja une adresse parait il..
d'après le scriboutchi que j'ai écrit en classe..
alors je me dis que si c'est une adresse et bien donc le *ptr est capable d'accepter Societe sans que je mette & devant
nan???
si je ne me goure pas CSociete *ptrSociete=new CSociete(); nous crée un pointeur nommé ptrSociete vers un objet sans nom stocké en mémoire ..
par contre CSociete Societe; nous crée un objet mémoire nommé Societe et il n'y a aucun pointeur et la je dis bravo c++ ??
je reve puisqu'on sait dire Societe.fonction() en quel honneur le peut on???????????
mais qu'est ce qu'un référent ??
quel est le référent de Societe??
Societe?????????????
je ne pige pas quel est le référent dans CSociete *ptrSociete=new CSociete();
serait-ce *ptrSociete?
ca n'a aucun sens
quel est l'intéret d'un dynamique par rapport a un statique ah la la je pige pas trop..
allez me critiquez pas et dites moi comment ca doit etre
Marsh Posté le 19-01-2005 à 01:30:28
bon, je fais clair:
- pour chaque new, 1 et 1 seul delete
- pour chaque new[], 1 et 1 seul delete[]
- n'appelle jamais le destructeur toi même. Si ton object est alloué automatiquement, t'as rien à faire. Si c'est un objet alloué dynamiquement, delete le (delete[] les)
- arrête ta cuisine, ça sert à rien. Réfléchis au niveau des type. Qui est un T, qui un T*, quel est le type de l'expression. Sinon, tu peux passer ta vie à rajouter/enlever des & / *
- c'est quoi ce délire sur le nom des objets ?
- un référant ? jamais entendu ce terme.
Marsh Posté le 19-01-2005 à 01:41:00
un référent... m'enfin ca vient d'un livre .. lol
merde c'est pas vrai vous voyez pas??
pourtant c'est tout ce que je veux savoir depuis le début..
et un alias ca vous dit rien??
bah c'est des termes UML
va voir sur ce lien ce qu'est un référent et un alias
http://c.developpez.com/faq/cpp/?p [...] _reference
bein je vais faire un truc en mspaint alors...
Marsh Posté le 19-01-2005 à 01:46:07
je cite :
"plusieurs réferents pour un même objet"
un meme objet peut il porter plusieurs noms? plusieurs referents qui contiennent tous la meme adresse pghysique peuvent ils designer en memoire un seul et meme objet??
OUI, s'il est nécessaire de nommer, donc d'accéder a l'objet , dans des contextes différents et qui s'ignorent mutuellement.
adressage indirect.
C'est la possibilité pour une variable non pas d'etre associée directement a une donnée mais plutot a une adresse physique d'un emplacement contenant,lui,cette donnée.IL devient possible de différer le choix de cette adresse pendant l'excution du programme totu en utilisant naturellement la variable.
et plusieurs de ces variables peuvent alorsp ointer vers un meme epmplacement. une telle variable est dénommée un pointeur en c et c++
dans le cours de l'écriture d'un programme orienté objet on accédera couramment a un meme objet par plusieurs referents générés dans différents contextes d'utilisation
Marsh Posté le 19-01-2005 à 01:47:20
donc merci pour le cours sur le delete mais bon je sais deja tout ca
moi ce qui m'intéresse c'est de faire pointer 2 pointeurs vers un seul objet
comment fait on en c++ svp ??
Marsh Posté le 19-01-2005 à 05:28:58
fullnight a écrit : un référent... m'enfin ca vient d'un livre .. lol |
Ben, référent est plus un terme de linguistique de base que de programmation aussi...
Marsh Posté le 19-01-2005 à 09:09:39
fullnight a écrit : moi ce qui m'intéresse c'est de faire pointer 2 pointeurs vers un seul objet |
...
abc -> objet
*abc -> ce vers quoi pointe l'objet
&abo -> adresse (en mémoire) de l'objet
un pointeur, c'est un objet (élément, pas nécessairement objet au sens POO) stockant l'adresse (en mémoire) d'un autre objet, donc on a abc -> adresse de l'objet et *abc -> objet.
Ben pour avoir deux pointeurs sur un même objet il suffit que les deux pointeurs stockent la même adresse
Par contre comme le dit Taz, un seul delete par new, donc pour chaque objet créé via new, un seul delete, quel que soit le nombre de pointeurs que tu colles dessus
Marsh Posté le 19-01-2005 à 21:13:32
int x=1;
x est un référent
int *ptrY=&x;
Y est un alias.
un pointeur ou un alias c'est très lié je dirais que c pareil
quand on fait l'instanciation CSociete Societe;
Societe est donc un référent .
g pigé :-)
alors la c cool
Marsh Posté le 19-01-2005 à 21:17:17
CSociete *ptrDeSociete= & Societe ;
CSociete *ptr2DeSociete= & Societe ;
ah voila
Marsh Posté le 19-01-2005 à 21:26:26
fullnight a écrit : int x=1; |
non !!!
x est appellé référent uniquement dans une fonction (ou méthode) a laquel tu aurais passé une référence à x en parametre
Marsh Posté le 19-01-2005 à 21:27:35
fullnight a écrit : CSociete *ptrDeSociete= & Societe ; |
t'en as pas marre sérieux ?
et ton histoire de référent, tu te le mets profonds. En C++, y a des valeurs et des références, rien d'autres.
Marsh Posté le 19-01-2005 à 21:43:06
y'a un truc que je pige pas...
avec visual c++ 6.0
je fais ca
CSociete *ptrSociete=new CSociete();
ptrSociete=NULL;
ensuite ptrSociete->fonction_de_l_objet(); est toujours possible a faire :| :| :|
entre nous taz je sais pas pourquoi t'es toujours sec comme ca faudrait te calmer un coup.
y'a pas que toi qui peut etre agressif!
C'est pas un accueil ca
Marsh Posté le 19-01-2005 à 21:46:53
non à l'exécution ca fonctionne
jviens d'essayer
Marsh Posté le 19-01-2005 à 21:50:32
tu déréférences un pointeur nul, t'as pas vu le crash alors !
Marsh Posté le 19-01-2005 à 21:52:48
fullnight a écrit : y'a un truc que je pige pas... |
Marsh Posté le 19-01-2005 à 21:57:17
bah je sais bien que ca se fait pas
mais faudrait penser a descendre de votre pied d'estalle les gars...
non mais ho...
Je teste et ho par hasard je vois que y'a encore moyen !
ca n'a aucun sens de faire ca je sais !!
mais bon je m'apercois que ca marche encore
trop fort
moi je dis bravo
faut un print screen peut etre?
Marsh Posté le 19-01-2005 à 22:00:40
fullnight a écrit : mais bon je m'apercois que ca marche encore |
Non ça marche pas, tu vois pas que ça plante, nuance
Marsh Posté le 19-01-2005 à 22:04:53
faut un print screen peut etre?
tu m'en diras des nouvelles et des nuances...
Code :
|
ptrSociete=NULL;
ptrSociete->fuck();
ca c'est fort
Marsh Posté le 19-01-2005 à 22:16:12
teste donc
Code :
|
Marsh Posté le 19-01-2005 à 22:22:50
Ca boum uniquement si la méthode est virtuelle ou qu'elle utilise un membre de la classe.
C'est d'ailleurs pour ça que son tout premier bout de code plantait: le destructeur était virtuel...
Marsh Posté le 19-01-2005 à 22:28:42
et sinon, on peut faire la fête à coups de if ( this == NULL )
Marsh Posté le 19-01-2005 à 22:28:49
effectivement ca ne va pas( dans ton cas )
dans le mien ca allait !
au fait regarde l'image suivant et explique moi pq on peut tj sélecter ce qu'on veut de l'objet..
sacré microsoft
Marsh Posté le 19-01-2005 à 22:32:29
merci lam's ta réponse est claire et correcte
Marsh Posté le 19-01-2005 à 22:34:05
fullnight a écrit : effectivement ca ne va pas( dans ton cas ) |
non mais alors toi t'es complètement à la masse hein
le fait que tu puisses "selecter" ce que tu veux n'a rien à voir avec Microsoft, c'est juste que l'IDE se base sur la déclaration de la classe pour te proposer ses méthodes et variables membres....
faudrait voir à arréter de dire des conneries maintenant hein, sinon je ferme ton topic
Marsh Posté le 19-01-2005 à 22:38:52
a ce point la? lol on dirait que tu bosses pour microsoft
bah ferme le topic alors car j'ai obtenu ske je voulais
Marsh Posté le 18-01-2005 à 23:36:20
salut a tous !
alors voila j'avais besoin de tester un petit truc !(deux pointeurs pointant un même objet)
avec dans un premier temps ce code ci qui marche sans erreur a l'exécution ( VC++ 6.0 )
ok jusque la ca va
et puis dans un deuxième temps
ce code ci ..... il me fait une erreur à l'exécution ( VC++ 6.0 )
mais qu'est ce qui ne va pas ? A quoi n'ai je pas fait attention.
dites le moi clairement s'il vous plait.
Message édité par fullnight le 19-01-2005 à 22:41:02