Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme Classe imbriquee C++

Private, public, protected???

    10 juin 2008 à 9:09:28

    Bonjour,

    Comment peut on faire pour acceder a certaine variable dans une classe de sa classe imbriquee ? Car si ces variables sont definies en private il faut faire des fonction GET et SET; mais entre les classes c long et pas pratique, comme (cf tuto C++ classe) on ne dois JAMAIS les definir en 'public', 'protected' peut etre??????
    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2008 à 9:15:51

      Tu parles d'une classe qui en possède une autre comme attribut c'est bien ça ?

      Private ou protected n'y changera rien. Tu devras faires des accesseurs et mutateurs.
      Cependant, si tu as trop besoin d'en faire, c'est peut-être que l'architecture génnérale est mal pensée.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        10 juin 2008 à 9:23:56

        Citation : Nanoc


        Private ou protected n'y changera rien. Tu devras faires des accesseurs et mutateurs.


        Pourquoi est tu contre le protected voir même le public?

        • Partager sur Facebook
        • Partager sur Twitter
          10 juin 2008 à 9:27:17

          Contre le public, parce que ça casse complètement l'encapsulation qui est un des fondements de la POO.

          Je suis pas contre le protected mais ça ne changera rien à son problème.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            10 juin 2008 à 9:48:54

            Citation : Nanoc

            Contre le public, parce que ça casse complètement l'encapsulation qui est un des fondements de la POO.


            Ouai la j'ai dit un peu n'importe quoi, dsl (je pensais à autre chose) .

            Citation

            Je suis pas contre le protected mais ça ne changera rien à son problème.


            pourquoi?
            • Partager sur Facebook
            • Partager sur Twitter
              10 juin 2008 à 9:58:44

              Si tu as :
              class Moteur{
                  public:
                  void Vroum();
                  protected:
                  double nb_cylindres;
              };
              
              class Voiture{
                  public:
                  void rouler();
                  private:
                  Moteur V16;
              };
              


              La classe Voiture ne pourra accéder au nombre de cylindres de son moteur que si l'attribut "nb_cylindre" est public, ce qui est mal ou si il y a un accesseur.

              Les questions à se poser sont alors :
              1) Voiture a-t'elle réelement besoin d'accéder à cette valeur ?
              2) Si oui ne faudrait-il pas réorganiser mes classes autrement ?
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                10 juin 2008 à 10:02:06

                je viens de comprend... quand il parlais d'imbriquée, cela ne voulais pas dire hérité...
                Bon ben j'avais rien compris...
                dsl pour le dérangement
                [edit]
                pour me racheter un poste intéressant sur l'encapsulation
                http://blog.emmanueldeloget.com/index. [...] encapsulation
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juin 2008 à 11:54:18

                  Oui pour l'instant j'opte pour remettre en question la structure de mon problème je suis un nouveau en POO je viens du monde Fortran ou tout est facile lol!
                  Disons que dans ton exemple Moteur voiture on comprend nikel mais imagine que dans ma classe moteur se trouve un ensemble de variable important, des double mais aussi des tableaux 4x4 donc avec des accesseurs et mutateurs çà va être lourd.
                  pour suivre ton exemple la classe voiture a plein de sous classe mais moi qui fais de la physique numérique le nbdepiston peut influer sur la rayon d'une roue. Mon probleme est que sur mon programme toutes les variable son liées et certaines varient souvent et leur variation est directement liée avec d'autre variable.

                  Pour décrire de façon ultra synthétique mon problème imagine qui tu ecrives un programme en C++ pour décrire l'évolution de points au court du temps. Tu as 10000points chaques points à des variable propre, coordonnées, vitesse, pression... chaque point cherche ses points voisins résout une équation grace à ses voisins et du cout met à jour toutes ces variables.

                  Donc j'ai des variables GLOBALE à tout mon programme (caractéristique du domaine, constante de physique...) je les met où ces variable on m'a dit de les mettres dans une classe et non en globale.

                  Ensuite si je crée une classe Point avec toute les propriété et les fonctions pour MàJ mes variables il me faut 10000 classe Point et que chacune puisse avoir accès à certaines info (variables) des autres classe Point.

                  Votre aide est importante car j'ai fais tout les cours et autre mais j'ai du mal à entrer dans le monde POO car ma tête réfléchis toujours en Fortran.

                  Merçi d'avance
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 juin 2008 à 16:23:46

                    Effectivement le plus dur c'est de changer la façon de penser ;)

                    Alors si ton programme est énorme et est déjà codé avec des variables globales c'est pas si grave mais tu peux les regrouper tranquillement dans des classes seulement si elles ont un lien entre-elles. Souvent on arrive à éliminer les variables globales grâce à une bonne implémentation de classes mais ce n'est peut-être pas facile pour tout les cas.


                    D'abords tout ce qui est constant peut rester global. Oublis les #define, fait plutot des const. Pourquoi ? Car si tu en as vraiment beaucoup tu peux regrouper les constantes dans des namespaces.

                    ex. (En passant mes connaissances actuellement limitées en physique sont présentées ici)
                    // au lieu de
                    #define VELOCITE_AAA val; // AAA c'est un nom pour une constante que je ne connais pas 
                    #define VELOCITE_BBB val;
                    #define VELOCITE_CCC val;
                    #define INTENSITE_AAA val;
                    #define INTENSITE_BBB val;
                    
                    // On a
                    namespace Velocite
                    {
                        const Type AAA = val;
                        const Type BBB = val;
                        const Type CCC = val;
                    }
                    
                    namespace Intensite
                    {
                        const Type AAA = val;
                        const Type BBB = val;
                    }
                    
                    // Dans le code si, exemple, j'écris une classe qui calcul de la vélocité
                    
                    using namespace Velocite;
                    
                    Type MaClass::f()
                    {
                        // n'importe quoi...
                        return ma_valeur * AAA - BBB / Intensite::AAA; 
                    }
                    


                    Donc différentes constantes peuvent porter le même nom mais être dans différents espaces de noms.


                    Pour les Points, s'il n'ont pas d'action propre à faire mais qu'ils ne représentes qu'un ensemble de données. Tu peux en faire des structures (struct) avec les attributs en public et faire une classe qui gère les Points. Elle engloberait l'ensemble des points et ne permetterait que l'accès constant ou à des copies de ses points. La manipulation des points serait validée ou ne serait possible qu'à l'intérieur de la classe à l'aide de méthodes.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 juin 2008 à 16:38:01

                      Bonjour,

                      Peut-être peux-tu décrire plus en détails la structure de ton problème, pour que certains puissent t'aider à choisir une structure de donnée/un design adapté(e) à ton problème. On peut faire tellement de choses en POO.

                      Par exemple si tu traites une courbe polygonale constituée de n points de contrôle, et qu'un calcul ne nécessite que la connaissance des coordonnées du point précédant et du point suivant (par exemple un calcul de courbure), une classe Point basée sur le modèle d'une liste doublement chainée suffira et chaque instance de Point sera capable d'aller lire les coordonnées des deux points voisins sans accesseurs (un membre private de l'instance d'une classe est accessible directement par une autre instance d'une même classe). Toutefois ses coordonnées seront encapsulées par rapport aux autres classes de ton programme.

                      Maintenant si tu traites un problème à n points où tous les points interagissent entre eux alors le problème est différent, donc la structure de ton programme l'est probablement aussi. Difficile donc de te conseiller sans plus de renseignements je pense.

                      Si dans ton cas tu as une classe racine qui représente l'ensemble de ton système et qui gère l'ensemble des Points, et si les calculs sont fait à partir de cette classe englobante tu n'auras pas trop le choix et tu seras obligés d'utiliser des accesseurs.
                      Mais tu pourrais peut-être envisager ta classe Point comme capable de calculer son mouvement propre (ou je ne sais quoi d'autre) à partir de l'ensemble des instances (en gardant une trace à l'intérieur même de la classe) auquel cas tu zappes les accesseurs.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 juin 2008 à 17:28:20

                        Un exemple simplifié 2D:

                        On remue 1000 billes dans un carré, on connait la position, vitesse (des plein d'autre propriétés) de chaque bille car on les lis ces infos dans un fichier.On connaissant la physique que le l'on veut décrire avec ces infos on est capable de connaitre la position future des bille au cours du temps. Mon problème est d'écrire en POO l'architecture de mes données de base.

                        J'ai des variables que je vais utiliser dans toutes les fonctions qui vont travailler sur les billes, elle seront présente partout en étant constantes. (dimension du cube, pas de temps, gravité ....)

                        J'ai des variables que je vais utiliser dans toutes les fonctions qui vont travailler sur les billes, elle seront présente partout en étant constantes pour chaque bille. (rayon de la bille, poids ....)

                        J'ai des variables que je vais utiliser dans toutes les fonctions qui vont travailler sur les billes, J'ai des variables que je vais utiliser dans toutes les fonctions qui vont travailler sur les billes, elle seront présente partout et changeant à chaque pas de temps pour chaque bille. (position, vitesse ....)

                        une classe bille semble chouette, apres je pensais crée un vector de classe avec toutes mes billes mais dejà là je galère!!

                        après le choix de POO dois permettre facilement à une bille de connaitre toutes les infos des bille qui l'entourne EX la vitesse de BILLE1 devient la moyenne des vitesses des BILLE1 BILLE31 BILLE15 BILLE18 BILLE91.

                        Voilou çà inspire du monde, en fortran je déclare toutes mes variable et tableaux et fonction et je fais un gros gros main!!! lol et en POO surtout que une bille avec plein de fonction sur ces variables et plein de variable propre çà ressemble bien à une classe... mais l'encapsulation... faire des SET() et GET() c rigolo pour un tuto mais qd il y 25variables dans le private (double matrice tableau...) dur !!!

                        HELP je bloque faite moi entrer dans le monde POO car pour l'instant je suis au bord de baisser les bras car coder un prog de 500 000lignes avec plus 2200 variable en tout genre c facile et rapide en Fortran déjà fais mais j'ai besoin de me mettre à jour!
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 juin 2008 à 18:27:09

                          D'abord tu as un Environnement (2D, 3D, whatever, ça ne fait que changer la matrice)

                          Cet Environnement regroupe une tonne de loi de physique avec ses constantes et ses variables.

                          Les Billes existe dans l'Environnement. Elles ont chacune des caractéristique (atrributs). Personnellement je crois que c'est à la bille de se déplacer. Tu peux avoir un ensemble de Billes dans l'Environnement et avoir un pointeur vers l'Environnement pour chaque Bille.

                          Alors toutes tes billes ont des coordonnées. Alors pour calculer la distance entre 2 points dans l'espace ou dans le Plan c'est pas trop compliqué. Tu peux utiliser une classe Plan ou Matrice si tu veux pour faire tout les calculs sur les points. Bille peut hériter ou être composé de Point.

                          Beaucoup de choses sont possibles... Le problèmes c'est de devoir apprendre un nouveau langage en même temps que de réingénérer un programme... c'est pas facile.

                          Pour ce qui est des accesseurs c'est pas obligatoire... Toutes les fonctions qui doivent agir sur les points peuvent faire parti de la classe (fonction membre, statique, amie) et avoir acces directement au variables. Si la classe Environnement doit nécessairement utiliser énormément de variables de Bille alors tu en fais une classe amie. Mais attention cela doit être fait seulement dans les cas qui nécessite ce genre de manipulation.


                          Essai de voir l'intéraction entre les classes. Penses a un classe comme des entités proposant des actions et des intéraction entre classes. Pas comme une liste de données.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Probleme Classe imbriquee C++

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown