IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Classe et attribut privé


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut Classe et attribut privé
    Bonjour à tous,

    je suis actuellement sur un petit projet MFC mais ma question porte plus sur des notions de C++.

    J'ai fait une classe qui contient 3 méthodes (rechercher le nombre de ligne d'un fichier, stocker les données du même fichier dans un tableau 2D et stocker d'autres infos du même fichier dans un autre tableau 1D cette fois).

    Il se trouve que je débute dans la déclaration de classe afin d'avoir un code un peu plus robuste et de ce que j'ai pu lire, il faut absolument déclarer les méthodes en PUBLIC et les attributs en PRIVATE. Si j'ai bien compris, on ne peut pas accéder aux attributs privés d'une classe en dehors de cette même classe.

    Ma question est donc de savoir comment je fais pour me servir des données que je viens de stocker et qui sont donc privées, dans une autre classe qui va faire des calculs avec ces mêmes données ? Ou alors, ce n'est pas comme ça qu'il faut procéder ou mon cas se prête mal aux classes, je ne sais pas.

    J'espère que j'ai été clair, merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Avatar de Garvelienn
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 244
    Points : 993
    Points
    993
    Par défaut
    Bonjour js_naka,

    il faut absolument déclarer les méthodes en PUBLIC et les attributs en PRIVATE. Si j'ai bien compris, on ne peut pas accéder aux attributs privés d'une classe en dehors de cette même classe.
    On ne peut pas être si catégorique. Une méthodes est public si elle a vocation à être appelée par une autre classe. Sinon elle devient privée. Idem pour les variables. Mais cependant attention, si une variable est public, il faut imaginer que quelqu'un peut y accéder et en faire ce qu'il veut. Et l'exemple typique: il peut détruire la variable sans que la classe propriétaire soit au courant.

    Après c'est un vieux débat sur ce qu'on peut mettre en public ou en private. Personnellement, j'ai tendance à mettre en private par défaut. Et si j'ai besoin de la variable à l'extérieur, j'utilise une méthode (un getter) pour y accéder (ce qui sujet à polémique ). Je pars du principe que toute classe doit avoir un contrôle sur sa mémoire et ne doit (presque) jamais en donner le privilège à l'extérieur.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    class Voiture
    {
    private:
           std::string nom;
           Roue roues[4];
    public:
           Voiture();
           void faireAvancer()
           {
               roues[0].tourner(1); // 1 tour par seconde par exemple
               roues[1].tourner(1);
               roues[2].tourner(1);
               roues[3].tourner(1);
           }
           void reparer()
           {
              if (faireDiagnostic1())
                   reparation1();
           }
           const Roue& getRoue(int r) const
           { 
               return roues[r];
           }
           const std::string& getNom() const
           {
               return nom;
           }
           void setNom(std::string& nouveauNom)
           {
                 nom = nouveauNom;
           }
     
    private:
           bool faireDiagnostic1()
           {
               // blablabal
           }
           void reparation1()
           {
              // blablabla
           }
    }

    Beaucoup ne seront pas d'accord avec moi et d'autres si.

    J'espère vous avoir un peu éclairé.
    «Le management, tel qu’on l’apprend dans les écoles et tel qu’on l’applique ensuite, sous prétexte de «motivation du personnel», organise exactement le contraire, à savoir la démotivation organisée.» - Bernard Stiegler

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Merci de votre réponse.

    Effectivement, j'ai voulu faire une méthode (getter) pour y accéder de l'extérieur (autre classe) mais ça me fait créer d'autres tableaux qui sont identiques à ceux que j'ai initialement stockés dans ma première classe. Je trouve ça un peu bête de dupliquer les données comme ça.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Une solution pragmatique serait de retourner une référence constante sur ton "tableau", qui est certainement un vector ou une list (enfin, j'espère)

    Tu peux vouloir retourner des itérateurs constants. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Bidule {...}
     
    class Data {
    private:
        using std::vector<Bidule> data_type;
    public:
        using data_type::const_iterator;
     
        const_iterator begin() const {return data.begin();}
        const_iterator end() const {return data.end();}
     
        void ajouter(Bidule const& b) {data.emplace_back(b);}
        void ajouter(... fichier);
     
    private:
        data_type data;
    };
    Tu peux aussi envisager un accesseur ciblé, retournant une référence constante sur un élément précis (par index ou par clé). En général, c'est le rôle de l'opérateur [] (ou () ).
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Merci ternel pour tes propositions.

    Juste une question, est-ce mieux d'utiliser un pointeur pour aller chercher les valeurs du tableau ? Mieux dans le sens programmation, maintenance et robustesse du code...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Bon, finalement j'ai supprimé mes attributs privés de la classe pour directement renvoyer les tableaux aux autres classes avec les membres publiques.

    Je m'excuse d'avance de poser la question parce que ce n'est pas le même sujet, mais mes matrices sont très volumineuses (380 000 lignes x 4 colonnes soit environ 120 Mo dans le gestionnaire Windows) et quand je quitte l'appli, ça prend un temps fou (10 sec).

    Est-ce intrinsèque à l'utilisation des vectors ?

  7. #7
    Membre éprouvé
    Avatar de Garvelienn
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 244
    Points : 993
    Points
    993
    Par défaut
    Sans vouloir embêter, ce n'est pas très professionnel et formateur comme solution. Mais si c'est pour un projet étudiant (je vois que vous êtes étudiant), no problem, on l'a tous fait

    Pour répondre à votre dernière question, je vais répondre par une autre question : comment utilisez-vous vos vectors ? C'est généralement "intrinsèque à la manière d'utiliser des vectors"
    «Le management, tel qu’on l’apprend dans les écoles et tel qu’on l’applique ensuite, sous prétexte de «motivation du personnel», organise exactement le contraire, à savoir la démotivation organisée.» - Bernard Stiegler

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/10/2012, 17h21
  2. [PHP 5.3] Attribut privé accessible depuis une classe enfant
    Par slydemusli dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2012, 14h14
  3. modifier un attribut privé d'une classe B
    Par adil54 dans le forum Général Java
    Réponses: 8
    Dernier message: 09/02/2011, 14h40
  4. [Icefaces] Attribut privés classe Singleton
    Par jad_jad dans le forum Frameworks Web
    Réponses: 1
    Dernier message: 07/02/2009, 00h27
  5. Réponses: 2
    Dernier message: 14/11/2008, 11h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo