accéder à un attribut privé

Voir le sujet précédent Voir le sujet suivant Aller en bas

accéder à un attribut privé

Message par gûl le Jeu 21 Mai - 11:07

slm,
j'ai un petit problème que j'éspère trouver sa solution chez vous:D
j'ai définit une classe qui a un vector d'objets comme attribut privé,lors du programmatiom j'avais besoin d'accéder à ce vector hors de cette classe (dans une autre),donc je me trouvais obligée soit de reprototyper la fonction oú je veut utiliser mon vector comme friend dans l aclasse concernée (une solution bizarre au niveau conception ),soit de faire une méthode get(accesseur à ce vector)(solution encore pire au niveau de gestion de mémoire ),soit le mettre en public(qui est la plus pire!!!!!!!!!!!!!!!!!!!)
avez vous une autre solution meilleure ????????
ps:urgennnnnnnnnnnnnnnnnnnnnnnnnnt
Merciiiiiiiiiiiiiiiiiiiiiiiiiii

gûl
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 20
Localisation : tunis
Réputation : 4
Points : 3198
Date d'inscription : 20/04/2009

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par Napoléon le Jeu 21 Mai - 17:48

j'avais besoin d'accéder à ce vector hors de cette classe

Explique plus la nature de l'accès que tu veux faire ...

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par gûl le Ven 22 Mai - 12:00

voici en résumé c'est que je veux faire:
l'idée du mon programme est faire une simulation physique des grains en interaction avec d'autres grains et des obstacles ,j'ai implémenté pour cela une classe grain ,une classe obstacle et une une classe systeme qui posséde entre autres une collection hétérogène des grains et une des obstacles .
cette classe système posséde une méthode evolue() qui fait évoluer (bouger ) les grains suivant les lois des mouvements .
donc il faut que j'ajoute à l'attribut force du grain toutes les forces appliquées par les autres grains et celles appliqées par les obstacles .
voici le code de cette méthode evolue():
Code:
void Systeme::evolue(double t)
{

    cout << "======================================================================" << endl;
//boucle parcourant tout le vector du grains pour ajouter à chaque grain les forces exercés sur lui
    for(unsigned int i(0);i
    {
        cout << i+1 << "a) calcul de la force 'perso'  : " << endl;

        //afficher l'attribut "force" , le coefficient de frottement
        cout << "f=" << grains[i]->getF() << "--(l=" << grains[i]->coeffrot(cte::p_air, cte::n_air);//p_air et n_air ce sont des ctes du milieu là c'est l'air

        //ajouter à l'attribut "force" la valeur "masse*g-l*vitesse"
        grains[i]->ajouteForce(cte::p_air, cte::n_air);

        //afficher le nouveau "force"
        cout << ")--> f=" << grains[i]->getF() << endl;
       

        cout << i+1 <<"b) calcul des forces obstacles : " << endl;
//boucle parcourant tous les obstacles pour ajouter au garin grains[i] les forces appliqués par tous les obstacles
        for(unsigned int j(0);j
        {
            Vecteur3D d(obstacles[j]->PointPlusProche(grains[i]->getPos()));//calcule du point le plus proche au grain i sur l'obstacle j

            //afficher sa valeur
            cout << "    point plus proche de l'obstacle " << j << " =" << d << endl;

            //calcul et affichage de l'écart entre l'obstacle j et le grain i
            cout << "    ecart à l'obstacle " << j+1 <<" =" << d-(grains[i]->getPos()) << endl;

            //calcul et affichage de la distance entre l'obstacle j et le grain i(la norme du vecteur trouvé dans l'écart)
            double a(sqrt((d-(grains[i]->getPos())).norme_carre()));
            cout << "    distance à l'obstacle " << j+1 << " =" << a << endl;

           
            cout << "    intensite de la force(" << a << ") =";
            Vecteur3D k(grains[i]->forceLJ(obstacles[j]->getPos()));//calcul de la forceLJ appliquée sur le grain i

            //introduire le produit scalaire entre la forceLJ  et le vecteur unitaire normal de l'obstacle pour déterminer le signe de l'intensité de la force
            if(k*(obstacles[j]->getV_U())<0.0){
                cout << -(sqrt((k.norme_carre()))) << endl;
            } else {
                cout << sqrt(k.norme_carre()) << endl;
            }

            //calcul et affichage de la force appliquée sur le grain i par l'obstacle j
            cout << "    df=" << grains[i]->ajouteForce(obstacles[j]);

            //mettre à jour la force appliquée sur le grain i en ajoutant "df" à "force"
            cout << ", f=" << grains[i]->getF() << endl;
           
           
        }
        cout << i+1 <<"c) calcul des forces des autres grains : " << endl;
        //boucle parcourant les garins de la position suivante de celle du courant(grains[i])pour lui  ajouter  forces appliqués par ces grains et ajoutant au grain en interaction avec grains[i](i.e grains[k]) la force opposé
        for(unsigned int k(i+1);k
        {
            Vecteur3D s(grains[k]->getPos()-grains[i]->getPos());//le vecteur de la distance entre le grain i et le grain k
            double b(sqrt(s.norme_carre()));//sa norme
            cout << " distance grain " << i+1 << " - grain " << k+1 << " : " << b << endl;
            cout << "    intensite de la force(" << b << ") =";
            Vecteur3D h(grains[i]->forceLJ(grains[k]->getPos()));//calcul de la forceLJ appliquée sur le grain i
            //introduction du produit scalaire comme dans le cas précédent
            if((h*s)<0.0){
                cout << -(sqrt(h.norme_carre())) << endl;
            } else {
                cout << sqrt(h.norme_carre()) << endl;
            }
            //calcul et affichage de la force appliquée par le grain k sur le grain i
            cout << "  df=" << grains[i]->ajouteForce(grains[k]);
            //mettre à jour la force appliquée sur le grain i en ajoutant "df" à "force"
            cout << ", f=" << grains[i]->getF() << endl;
            //
            grains[k]->ajouteForce(-(grains[i]->ajouteForce(grains[k])));//ajouter la force opposée au grain grains[k]
        }

        //déplacement du grain i
        cout << i+1 <<"d) bouger : " << endl;
        cout << " f =" << grains[i]->getF() << endl;//afficher la force totale appliquée sur le grain i
        Vecteur3D v_prec(grains[i]->getVit());//vitesse du grain i avant le déplacement
        Vecteur3D x_prec(grains[i]->getPos());//position du grain i avant le déplacement
        grains[i]->bouger(t,cte::p_air, cte::n_air);//déplacer le grain i pendent un pas de temps "t" dans l'air
        cout << "dv =" << (grains[i]->getVit()-v_prec) << endl;//afficher la différence entre la nouvelle et l'ancienne vitesse du grain
        cout << "dx =" << (grains[i]->getPos()-x_prec) << endl;//afficher la différence entre la nouvelle et l'ancienne position du grain
        cout << "x =" << grains[i]->getPos() << endl;//position du grain i après le déplacement
        cout << "v =" << grains[i]->getVit() << endl;//vitesse du grain i après le déplacement
    }
   
   
   
       
}
peut être c'est pas tout clair mais ça donne idée au moins
une autre question :
j'ai utilisé pour cette evolue() l'algorithme 1:

  • calculer la force ne dépendant pas des autres grains ni
    obstacles (méthode ajouteForce())
  • Pour tous les obstacles, ajouter la force qu'exerce l'obstacle
    sur le grain (méthode ajouteForce(Obstacle))
  • Pour tous les autres grains non encore considérés (i.e. les
    grains suivants), ajouter la force qu'exerce ce grain
    sur le grain courant, et ajouter l'opposé de cette force au grain en
    question (méthodes ajouteForce(Grain) et ajouteForce(Vecteur))
  • déplacer le grain en utilisant la méthode d'Euler-Cromer (méthode bouger)


Un autre algorithme (algorithme 2), extrêmement proche
consiste à effectuer les étapes 1 à 3 pour tous les grains, puis
ensuite dans une seconde boucle sur tous les grains à effectuer 4.Quelle est la complexité de ces deux algorithmes
ci-dessus ?
Merciiiiiiiiiiiiiiiiiiiiiiii

gûl
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 20
Localisation : tunis
Réputation : 4
Points : 3198
Date d'inscription : 20/04/2009

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par Napoléon le Dim 24 Mai - 11:17

En lisant ce qui est demandé dans ce petit projet, j'imagine qu'il faut au moins définir :
- l'objet GRAIN,
- l'objet OBSTACLE,
- l'objet FORCE (vecteur),
- l'objet ENVIRONNEMENT,
- l'objet SIMULATION.

Un objet GRAIN doit connaitre les informations suivantes:
- les coordonnées de son centre de gravité dans un repère,
- son vecteur vitesse à un instant t,
- son vecteur accélération à instant t.

L'objet OBSTACLE doit connaitre :

- des informations sur sa forme telles que ses frontières: c'est l'une des données les plus difficiles à définir vu que ça peut être soit une forme standard: cercle,triangle... ou une forme quelconque.
- des informations sur la nature physique de la matière qui le compose: ça peut être intéressant dans l'évaluation des forces résultantes pendant un choc GRAIN / OBSTACLE: mou, élastique, perte ou conservation de quantité de mouvement...
- vecteurs vitesse et accélération de l'obstacle si jamais un obstacle est mobile.

L'objet FORCE représente un simple vecteur à 2 dimensions. Il peut modéliser la force de frottement par exemple:
- vecteur directeur,
- intensité,

L'objet ENVIRONNEMENT rassemble tous les objets définies ci-dessus. En fait, à un instant t donné, l'environnement est formé de plusieurs Grains se déplaçant en respectant l'existence de certains Obstacles et en tenant compte de certaines Forces spéciales pouvant apparaitre. Ca peut être une liste d'objets de différentes natures (vive le polymorphisme).

L'objet SIMULATION contient les paramètres de la simulation physique. Il permet de faire évoluer l'objet ENVIRONNEMENT ainsi que toutes ses composantes en fonction du temps:
- attribut: Intervalle de rafraichissement du système

à suivre.

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par gûl le Mar 26 Mai - 23:59

slm,
en fait ce programme était le sujet de notre petit projet de semestre et ma première question qui était précise vient dans le cadre d'amélioration de mon code.
En tout cas j'ai rendu mon projet le dimanche (donc à l'heure où cette intervention était écrite,j'étais en train de faire les dernières retouches c'est pour ça que j l'ai pas lu immédiatement Razz,j'aurait dû poser ma question avant:roll:)
Je te félicite pour cette description assez simple, assez claire du programme!!!!!!!!!!!
C'est presque que j'avait fait, la force n'était pas elle même une classe mais j'avait définit une classe Vecteur3D représentant les vecteurs (au sens mathématique(x,y,z))dans l'espace donc elle me servait à bien définir les positions des grains et des obstacles,leurs vitesses ,les vecteurs normales (directeurs) des obstacles et les forces.
ce n'est qu'un petit projet pour des débutants en C++,comme tu l'as déjà dit ,donc on a bien simplifié le problème disant que l'obstacl est immobile et ne peut prendre qu'une forme standard !
donc si j'ai bien compris ton analyse ton ENVIRONNEMET sera mon Systeme (écrit dans le code là en haut).
mais ce que j'ai pas trop saisi c'est ton objet SIMULATION qui a pour but,je pense d' évoluer le systeme et qui correspond normalemennt dans mon code à la méthode evolue(dt) de la calsse Systeme.
est-il,selon toi, plus propre de définir cette classe SIMULATION que plutôt définir une méthode evolue dans la classe Systeme?
et pour évoluer le systeme ,tu définit ,je suppose,une méthode evolue dans la classe SIMULATION qui prend en paramètre un système,et donc pour appeler cette méthode ,on fait :
simulation.evolue(systeme);
au lieu de faire
systeme.evolue(dt);

en tout cas merci pour ta réponse

gûl
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 20
Localisation : tunis
Réputation : 4
Points : 3198
Date d'inscription : 20/04/2009

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par Napoléon le Mer 27 Mai - 11:47

En définissant la classe SIMULATION, c'est plus clair, plus simple et plus ouvert à des extensions du projet:

Code:
SIMULATION sim = new SIMULATION(freq,nCycle,&env,&result)

En fait, il y a quelques paramètres qui décrivent la simulation que tu veux faire; en est exemple :

- la fréquence de rafraichissement (freq) du système, pouvant s'exprimer en nombre de millisecondes, ou aussi pouvant servir pour une simulation à évènements discrets...

- le nombre de cycles (nCycle) ou aussi durée de vie de la simulation,

- l'environnement (env) donné à l'objet (sim) pour qu'il soit traité,

- le résultat de la simulation (result) un objet pouvant éventuellement stocker tous les déplacements qui ont eu lieu par exemple, ou quelques statistiques sur l'environnement (énergie totale du système, la chaleur dégagée etc... on peut imaginer plusieurs choses) ...


I hope it helps !

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par gûl le Jeu 28 Mai - 0:41

Concernant ces paramétres,d'un part j'ai définit la fréquence de rafraichissemnt comme un attribut statique dans ma classe systeme d'autre part, j'ai passé le nombre de cycles en argument au main,mais bien évidemment ton idée parrait plus propre et plus claire!!!
enfin pour &result,il me parrait que ça sera un flot pour rediriger le résultat(i.e un ostream),non?

gûl
Entier Naturel
Entier Naturel

Féminin
Nombre de messages : 20
Localisation : tunis
Réputation : 4
Points : 3198
Date d'inscription : 20/04/2009

Feuille de personnage
Capacité linguistique:
1000/1000  (1000/1000)

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par Napoléon le Jeu 28 Mai - 1:30

&result : peut être un pointeur sur un objet "DATA", une classe mère de laquelle on peut dériver plusieurs autres classes:
- sauvegarde dans un fichier texte
- sauvegarde dans un fichier excel
- sauvegarde dans une liste dans la mémoire, ou toute autre structure de donnée,...

DATA devrait disposer d'une méthode virtuelle (ou abstract method) du type:
Code:
public int DATA::Add(Object obj);

à suivre...

_________________
Nabil - tunis
خير الناس أنفعهم للناس
avatar
Napoléon
Admin
Admin

Masculin
Nombre de messages : 2934
Localisation : Tunisie
Réputation : 122
Points : 5340
Date d'inscription : 19/03/2007

Feuille de personnage
Capacité linguistique:
999/1000  (999/1000)

http://infomath.online-talk.net

Revenir en haut Aller en bas

Re: accéder à un attribut privé

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum