Bonjour...
Comment faire pour passer un objet à une fonction sans que cette fonction ait accès à la version originale de l'objet (c'est à dire passer un objet par valeur comme en C++).
Merci de me donner un coup de main...
A bientot.
Bonjour...
Comment faire pour passer un objet à une fonction sans que cette fonction ait accès à la version originale de l'objet (c'est à dire passer un objet par valeur comme en C++).
Merci de me donner un coup de main...
A bientot.
Une copie? La methode clone() doit servir à cela d'habitude mais si tu créer une nouvelle classe, il va te falloir re implementer cette fonction...
Remarque : tu peux aussi creer une autre fonction avec une autre signature ayant le meme effet...
Au passage, rappelons qu'en java tous les passages de paramètres se font par valeur. Pour les objets, c'est une copie de la référence qui est passé ce qui explique que l'on puisse altérer l'objet mais pas lui affecter une nouvelle référence.
Sinon la méthode clone() me parait être une bonne idée.
![]()
-"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
-"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".
Pieds d'argile (1996), Terry Pratchett 1948 - 2015
(trad. Patrick Couton)
merci de me répondre...
En fait je suis novice en java (je me forme ...).
J'ai lu pas mal de remarques dans d'autres discussions sur le site, concernant le passage de parametres... Je viens du C/C++. Effectivement le fonctionnement parait légerement différent...
J'ai compris que tout les passages étaient par valeur et que pour les objets c'est la valeur de la référence qui était passée.
J'ai du mal m'expimer dans mon message de base. Je vous explique mon cas, ce sera plus clair...
A la base j'ai un probleme avec les vecteurs et je pense que e probleme vient du passage de mes arguments...
MonObjet MO = new MonObjet(); // Objet avec deux propriétés Nom et prenom par exemple:
*********************
Vector v = new Vector();
MO.Nom = "Nom1";
MO.Prenom = "Prenom1";
v.add(MO);
MO.Nom = "Nom2";
MO.Prenom = "Prenom2";
v.add(MO);
for (int i=0 ; i<v.size() ; i++) {
MO = (MonObject)v.get(i);
System.out.println(MO.Nom);
System.out.println(MO.Prenom);
}
**********************
Lors de l'exécution je me rettrouve avec :
*********
Nom2
Prenom2
Nom2
Prenom2
*********
Je trouve ça assez déconcertant. Comme si 'add' ajoutait le pointeur sur MO au vecteur... et non pas l'objet lui-meme (d'ou ma question sur le passage par valeur!!!). La modification de MO prenant donc effet sur les deux objects ajoutés... Comment pallier ce probleme ????
![]()
Le problème vient du fait que tu initialises deux fois les attribut du meme objet 'MO', tu arais exactement le même problème en C++ car c'est la dernière affectation qui est prise en compte, à savoir nom2 et prenom2.
Il faut donc que tu instancies deux objets MO1 et MO2 :
v.add(MO1);
v.add(MO2);
Une autre solution consisterait - comme on te l'a dit - à cloner l'objet lors de l'ajout dans le vecteur, mais pour cela, tu devras redéfinir la méthode clone() dans ta classe MonObjet :
je ne vois pas d'autre solution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 MO.nom=xxxx; MO.prenom=xxxx; v.add(MO.clone()); MO.nom=yyyy; MO.prenom=yyyy; v.add(MO.clone());
Enfin si, une petite derniere : creer ta propre classe vecteur, et dans la méthode add() faire une copie explicite...
Sinon, je pense qu'en java, la meilleur méthode serait quand-même de créer deux objets ( cf mon premier post ), car ce sont bien deux instances distinctes par la valeur de leurs attributs.
iohack > En fait en C++ il est courant que l'appele fasse une copie de l'objet passe en parametre, d'ou la technique employee ici.
xc78370 > En Java on cree l'objet deux fois. On ferait meme sans reference explicite :
v.add(new MO("nom", "prenom"));
v.add(new MO("nom1", "prenom1"));
Il me semble que les collections en C++ fonctionnent comme en java, c'est à dire par référence ( je peux me tromper, ça fait un bail que j'ai pas codé de C ).Envoyé par Gfx
Sinon effectivement, les méthodes effectuent une copie des paramètres - à moins qu'un '&' ou un pointeur ne soit spécifié dans leur prototypage.
Merci bien à vous tous de m'avoir répondu si précisément... Je vais pouvoir avancer...
merci..
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager