référent pointeurs alias

référent pointeurs alias - C++ - Programmation

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 )
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class CSociete
  4. {
  5. public:
  6. CSociete(){;};
  7. virtual ~CSociete(){cout<<"destruction"<<endl;}; 
  8. };
  9. void main()
  10. {
  11. // 2 manières de créer un objet
  12. CSociete *ptrSociete=new CSociete();
  13. CSociete Societe;
  14. ptrSociete->~CSociete();    // affichage du mot destruction  
  15. system("PAUSE" );
  16. }    // affichage du mot destruction une 2 eme fois


 
 
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 )
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class CSociete
  4. {
  5. public:
  6. CSociete(){;};
  7. virtual ~CSociete(){cout<<"destruction"<<endl;}; 
  8. };
  9. void main()
  10. {
  11. CSociete *ptrSociete=new CSociete();
  12. CSociete Societe;
  13. CSociete *ptr = NULL;
  14. ptr->~CSociete();
  15. system("PAUSE" );
  16. }


 
 
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
Reply

Marsh Posté le 18-01-2005 à 23:36:20   

Reply

Marsh Posté le 18-01-2005 à 23:40:44    

Code :
  1. # CSociete *ptr = NULL;
  2. # ptr->~CSociete();


 
 :sarcastic:


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 18-01-2005 à 23:51:32    

[:daplopbot]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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.


Message édité par PtitKiki le 18-01-2005 à 23:54:47
Reply

Marsh Posté le 19-01-2005 à 00:35:20    

PtitKiki a écrit :

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.


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


Message édité par fullnight le 19-01-2005 à 02:51:19
Reply

Marsh Posté le 19-01-2005 à 00:48:02    

ça va pas la tête d'appeler le destructeur explicitement !

Reply

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".


Message édité par fullnight le 19-01-2005 à 02:52:40
Reply

Marsh Posté le 19-01-2005 à 00:53:32    

c'est sur qu'en codant ainsi, tu vas pas te faire beaucoup d'amis...


---------------
Nos estans firs di nosse pitite patreye...
Reply

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


Message édité par fullnight le 19-01-2005 à 02:53:49
Reply

Marsh Posté le 19-01-2005 à 00:56:20    

on joue pas avec les pointeurs si on sait pas ce que c'est :pfff:


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 19-01-2005 à 00:56:20   

Reply

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


Message édité par fullnight le 19-01-2005 à 02:54:31
Reply

Marsh Posté le 19-01-2005 à 01:02:07    

bon bin alors ?
avec un peu de jujote, tu dois trouver tout seul :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

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?


Message édité par fullnight le 19-01-2005 à 02:57:05
Reply

Marsh Posté le 19-01-2005 à 01:12:09    

[:daplopbot]
 
toi t'as pas écouté au cours...
 
 
 
PS : Taz, regarde pas ca, sinon tu vas faire une attaque...


---------------
Nos estans firs di nosse pitite patreye...
Reply

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  :sweat:  ah la la je pige pas trop..
 
 
allez me critiquez pas et dites moi comment ca doit etre


Message édité par fullnight le 19-01-2005 à 03:41:05
Reply

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.

Reply

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...
 
http://www.membres.lycos.fr/zonefullnight/hehe.JPG


Message édité par fullnight le 19-01-2005 à 03:40:30
Reply

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

Reply

Marsh Posté le 19-01-2005 à 01:47:20    

donc merci pour le cours sur le delete  :jap: mais bon je sais deja tout ca  :kaola:  
 
 moi ce qui m'intéresse c'est de faire pointer 2 pointeurs vers un seul objet :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  
 
comment fait on en c++ svp :sarcastic: ??


Message édité par fullnight le 19-01-2005 à 21:54:22
Reply

Marsh Posté le 19-01-2005 à 05:28:58    

fullnight a écrit :

un référent... m'enfin ca vient d'un livre .. lol
 
merde c'est pas vrai vous voyez pas??


 
Ben, référent est plus un terme de linguistique de base que de programmation aussi...

Reply

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 :bounce:  :bounce:  :bounce:  :bounce:  :bounce:


...
 
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 [:spamafote]  
 
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


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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


Message édité par fullnight le 19-01-2005 à 21:19:35
Reply

Marsh Posté le 19-01-2005 à 21:17:17    

CSociete *ptrDeSociete= & Societe ;
CSociete *ptr2DeSociete= & Societe ;
 
ah voila :)


Message édité par fullnight le 19-01-2005 à 21:20:52
Reply

Marsh Posté le 19-01-2005 à 21:26:26    

fullnight a écrit :

int x=1;
x est un référent  


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 :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 19-01-2005 à 21:27:35    

fullnight a écrit :

CSociete *ptrDeSociete= & Societe ;
CSociete *ptr2DeSociete= & Societe ;
 
ah voila :)


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.

Reply

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


Message édité par fullnight le 19-01-2005 à 21:48:53
Reply

Marsh Posté le 19-01-2005 à 21:46:13    

ça fait boum à l'execution. A part ça, tout va bien !

Reply

Marsh Posté le 19-01-2005 à 21:46:53    

non à l'exécution ca fonctionne
jviens d'essayer


Message édité par fullnight le 19-01-2005 à 21:47:09
Reply

Marsh Posté le 19-01-2005 à 21:50:32    

tu déréférences un pointeur nul, t'as pas vu le crash alors !

Reply

Marsh Posté le 19-01-2005 à 21:52:48    

fullnight a écrit :

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


 
 :cry:  :cry:  


---------------
Nos estans firs di nosse pitite patreye...
Reply

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?


Message édité par fullnight le 19-01-2005 à 21:59:41
Reply

Marsh Posté le 19-01-2005 à 22:00:40    

fullnight a écrit :

mais bon je m'apercois que ca marche encore  
trop fort
moi je dis bravo
 
faut un print screen peut etre?


Non ça marche pas, tu vois pas que ça plante, nuance


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 19-01-2005 à 22:04:53    

faut un print screen peut etre?
 
 
tu m'en diras des nouvelles et des nuances...
http://membres.lycos.fr/zonefullnight/hehe.JPG&#034;

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class CSociete
  4. {
  5. public:
  6. CSociete(){;};
  7.     CSociete(const CSociete & ){;};
  8. void fuck(){cout<<"test"<<endl;};
  9. virtual ~CSociete(){cout<<"destruction"<<endl;}; 
  10. };
  11. void main()
  12. {
  13. CSociete *ptrSociete=new CSociete();
  14. CSociete Societe;
  15. int x=1;
  16. int *y=&x;
  17. cout<<"adresse de x "<<y<<endl;
  18. cout<<"adresse de x "<<&x<<endl;
  19. CSociete *ptr=&Societe; // &Societe c'est l'adresse de l'objet nommé société. Societe est un référent!
  20. cout<<"adresse de Societe "<<ptr<<endl;
  21. ptr->fuck();
  22. cout<<"adresse de ptrSociete "<<ptrSociete<<endl;
  23. ptr=ptrSociete; // est ce que ptr pointe L AUTRE objet ??  OUI
  24. cout<<"adresse de ptr "<<ptr<<endl;
  25. ptrSociete=NULL;
  26. cout<<"adresse de ptrSociete "<<ptrSociete<<endl;
  27. ptrSociete->fuck();
  28. system("PAUSE" );
  29. }


 
ptrSociete=NULL;  
         ptrSociete->fuck();

 
ca c'est fort


Message édité par fullnight le 19-01-2005 à 22:10:44
Reply

Marsh Posté le 19-01-2005 à 22:16:12    

[:itm]  
 
teste donc

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class CSociete
  4. {
  5.     int ffs;
  6. public:
  7. CSociete():ffs(15) {};
  8.     CSociete(const CSociete & ) {};
  9. void fuck(){cout<<"test"<<endl;};
  10. void idiot() {cout << ffs << endl;};
  11. virtual ~CSociete(){cout<<"destruction"<<endl;}; 
  12. };
  13. int main(int argc, char ** argv)
  14. {
  15.     CSociete *ptrSociete=new CSociete();
  16.     CSociete Societe;
  17.    
  18.     CSociete *ptr=&Societe;
  19.    
  20.     ptr->fuck();
  21.    
  22.     ptr=ptrSociete;
  23.    
  24.     cout << "Test v1" << endl;
  25.     ptrSociete->fuck();
  26.     ptrSociete->idiot();
  27.    
  28.     ptrSociete=NULL;
  29.    
  30.    
  31.     cout << "Test objet v1" << endl;
  32.     ptrSociete->fuck();
  33.     cout << "Test objet v2" << endl;
  34.     ptrSociete->idiot();
  35. }


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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... :o

Reply

Marsh Posté le 19-01-2005 à 22:28:42    

et sinon, on peut faire la fête à coups de if ( this == NULL )  :love: :love: :love:

Reply

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
 
http://membres.lycos.fr/zonefullnight/skimetonne.JPG

Reply

Marsh Posté le 19-01-2005 à 22:32:29    

merci lam's ta réponse est claire et correcte :)


Message édité par fullnight le 19-01-2005 à 22:32:37
Reply

Marsh Posté le 19-01-2005 à 22:34:05    

fullnight a écrit :

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
 
http://membres.lycos.fr/zonefullnight/skimetonne.JPG


non mais alors toi t'es complètement à la masse hein [:mlc]
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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed