Passage d'objet en parametre

Résolu
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 - 7 nov. 2006 à 14:42
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 - 7 nov. 2006 à 19:15
Bonjour a tous,
voila en fait je passe un objet a en paramètre d'un constructeur d'un objet b et normalement si je ne me trompe pas cet objet a devrait etre passé par référence, donc toute modification de cette objet a dans l'objet b entraine une modification de l'objet a dans toutes les classes où il est utilisé.
Ce que je ne comprend pas c'est que cela n'a pas l'air de se passé dans le cas de mon application. Voici des bouts de code pour vous montrer comment je m'y prend:

fichier1.cs: (ici je fait un appel a une classe et je passe un objet en param)
private CDroit droit;
...
frmLogin fLogin = new frmLogin(this.droit);
fLogin.ShowDialog();

fichier2.cs: (ici je modifie l'objet passé en param dans le constructeur)
private CDroit _droit;
...
public frmLogin(CDroit d)
        {
            InitializeComponent();

            // lecture du fichier de configuration
            this.opt = new COption();
            this.opt.loadXML();

            // droit
            this._droit = d; // garde en mémoire la ref de l'objet

            // ajout des logins
            this.ajoutLogin();
        }
...
private bool verifLogin()
        {
            ...
            // definition du droit
            this._droit = new CDroit(droit); // ici je modifie l'objet du param constructeur
            ...
            return (true);
        }

Or l'objet n'est pas modifié n'est pas modifié dans le fichier1. Et je ne comprend pas pourquoi vu que les objets devrait etre passé par reference donc dans le constructeur je ne copie pas un nouvel objet mais je fait pointé un objet vers la reference d'un autre.
Aidez-moi s'il vous pait...
Merci par avance.
Bob...
"Vaut mieux se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet..."

4 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
7 nov. 2006 à 15:05
Hello,

this._droit = new CDroit(droit); // ici je modifie l'objet du param constructeur

Avec cette ligne tu fait pointer this._droit sur un  nouvel objet, l'objet que tu as passé en paramètre n'est pas touché, et c'est normal.

par contre, si tu fais this._droit.UnePropriété = UneValeur;
alors, la propriété de l'objet passé en paramètre dans le constructeur sera également affectée, pour autant que tu n'ais jamais fait "this._droit = QuelqueChose" ailleurs que dans le constructeur.

Amicalement, SharpMao
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
7 nov. 2006 à 15:23
Hello,

Encore un peu plus d'explications.
Au début, tu fais dans ton fichier1 this.droit = new CDroit();

Ensuite, dans le constructeur de fichier2, tu fait pointer this._droit vers l'objet passé en paramètre

Mais quand tu fais this._droit = new CDroit();, tu ne changes que la référence de fichier2._droit, et pas celle de fichier1.droit :

Voilà, j'espère que c'est un peu plus clair.

Amicalement, SharpMao
3
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
7 nov. 2006 à 15:21
ok exactement, erreur de logique de ma part. je te remercie pour ta réponse.
Merci et bonne continuation a toi.
Bob...
"Vaut mieux se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet..."
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
7 nov. 2006 à 19:15
oui j'avais bien compris. c'est juste que en allant vite, certain détails m'ont échapé. et quand je fesait dans me fichier2 le new Droit();
je pensais instancier en meme temps la classe referencé dans le fichier1.

mais bon c'est en voulant allé trop vite avec un peu de fatigue. mais bon ca ne m'excuse en rien.
sinon je te remercie encore pour ce details d'information et de bien poussé tes explication. merci.
Bob...
"Vaut mieux se taire et passer pour un con, que de l'ouvrir et ne laisser aucun doute sur le sujet..."
0
Rejoignez-nous