Pointeurs

elfelf Membre
16:42 modifié dans API AppKit #1
Surement une question stupide mais est ce que il y a aussi le même problème avec les pointeurs que avac java?

Autrement dit si je fais:

<br />MaClasse *mc;<br />MaClasse *mc2;<br />[[mc alloc] init];<br />[[mc2 alloc] init];<br />[mc setValue:13];<br /><br />mc2 = mc;<br /><br />[mc2 setValue:1];<br /><br />NSLog(&quot;%i&quot;, [mc getValue]);


ça afficheras 13 ou 1?

Car si j'ai bien compris ce que j'ai lu sur les pointeurs mc2 = mc; assigne mc2 vers l'espace mémoire de mc dans si ej change la valeure de mc2 ça changeras egualement celle de mc. Donc pour copier la classe je dois utiliser un truc qui s'appelle un opérateur de copie?

Réponses

  • fouffouf Membre
    16:42 modifié #2
    Tu as tout capiche. Par contre, quelques précision : il n'y a pas de pointeur en Java, je peux te l'assurer. Et puis ton code comporte une fuite mémoire : tu fais un alloc-init de mc2 sans faire un release (d'ailleur, tu ne l'utilises même pas). Ensuite, il ya une énorme erreur dans l'allocation : alloc est une methode de classe. [mc alloc] est faux, il faut faire [MaClasse alloc]. Ensuite, comment veux tu que mc ne soit pas nil si tu ne lui assigne rien. Ca va donc te donner :
    mc = [[MaClasse alloc] init]; pareil pour mc2.

    A la fin, ton code affichera 1.
  • elfelf Membre
    16:42 modifié #3
    OK...

    il n'y a pas de pointeur en Java, je peux te l'assurer


    Je viens de lire tout un livre sur java qui m'assurais le contraire

    tu fais un alloc-init de mc2 sans faire un release (d'ailleur, tu ne l'utilises même pas). Ensuite, il ya une énorme erreur dans l'allocation : alloc est une methode de classe. [mc alloc] est faux, il faut faire [MaClasse alloc]. Ensuite, comment veux tu que mc ne soit pas nil si tu ne lui assigne rien. Ca va donc te donner :
    mc = [[MaClasse alloc] init]; pareil pour mc2.


    Oups tu as raison j'ai aps fait attention...

    Merci
  • fouffouf Membre
    16:42 modifié #4
    il n'y a pas de pointeur en Java, je peux te l'assurer

    Je viens de lire tout un livre sur java qui m'assurais le contraire

    I'm very sure. J'ai fait pas mal de petits programmes en Java et je peux t'assurer qu'il n'y pas pas de pointeur tel que le C, le C++ ou l'Objective-C l'entend. C'est peut-être d'autre chose dont tu parles ;)
  • ChachaChacha Membre
    16:42 modifié #5
    Si je puis me permettre de mettre mon grain de sel : d'après moi en Java, tout est pointeur. Donc il s'agit d'une question de point de vue, sur ce qu'on entend par pointeur.

    +
    Chacha
  • groumpfgroumpf Membre
    16:42 modifié #6
    en java on parle plutot de références.

    Sinon le prog affiché à  de grandes chances de planter, il faut écrire
    Maclasse *mc = [[MaClasse alloc] init];

  • elfelf Membre
    16:42 modifié #7
    Oui groumpf ça à  déjà  été dit plus haut...


    Java c'est des références, mais pointeur ça revien au même vu que le principe est le même......
  • BruBru Membre
    16:42 modifié #8
    Non, non et non, Java ne connait pas de pointeur.

    Effectivement, on parle de référence d'un objet : il s'agit d'un numéro séquentiel (le 1er object créé a la référence 1, le suivant 2, etc.).

    Quelque part dans la JVM, il doit y avoir une table d'association entre référence et pointeur, mais ceci échappe à  la portée du simple développeur : seul Dieu (et mpergand) sait...

    .
  • groumpfgroumpf Membre
    16:42 modifié #9
    désolé pour le doublon, pas vu,

    en java il n'existe pas d'arithmetique sur les pointeurs comme en C, on ne fait pas *p++ par exemple, on utilise des Iterator sur des Collections d'objets, c'est plus éloigné du code machine.
  • mpergandmpergand Membre
    16:42 modifié #10
    dans 1126630618:

    Quelque part dans la JVM, il doit y avoir une table d'association entre référence et pointeur, mais ceci échappe à  la portée du simple développeur : seul Dieu (et mpergand) sait...


    Je viens de demander à  Dieu et il est comme moi, il sait pô  :)

    J'ai lu un truc un jour qui parlait de handle (double pointeurs), ce qui permettrais à  la VM de faire de la reallocation de blocs. En fait, on s'en fout un peu, puisque la gestion de la mémoire en java, c'est l'affaire de la VM, point.



    Java c'est des références, mais pointeur ça revien au même vu que le principe est le même......


    Mouais, si tu fais un jour du C++, tu vas avoir des problèmes  ;)

    En C++ on peut avoir 3 sortes d'objets:
    Des objets statiques ou alloués dans la pile:
    MaClass monObjet;

    Des objects alloués dynamiquement:
    MaClass* monObjetPt= new MaClass();

    et enfin des références à  des objets:
    MaClass& monObjetRef=monObjetPt;

    et on se rend compte rapidement que dans la majorité des cas, on peut utiliser ces références en lieu et place de ces satanés pointeurs, en particulier pour les paramètres de fonctions:

    virtual bool HasResourceFork(const LFile& inFile);

    c'est plus clair, car on n'a pas à  utiliser l'opérateur d'indirection ->

    et puis je pense que toute notion de pointeur devrait être banni des langages modernes, d'ailleurs je ne comprends pas pourquoi en objC, on est obligé de déclarer des pointeurs d'objets, on peut rien en faire de ces pointeurs de toutes les façons. Ils devraient être cachés par l'implémentation...
Connectez-vous ou Inscrivez-vous pour répondre.