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 :

[C++] Variable Membre en lecture seule


Sujet :

C++

  1. #1
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Par défaut [C++] Variable Membre en lecture seule
    Bonjour a tous

    Je cherche le moyen/syntaxe pour rendre une Variable Membre d'une class en Lecture Seule mais accessible en Lecture Ecriture pour les Fonction Membre de cette class.

    Dans l'idéale, j'aurais aimé utiliser une syntaxe proche de celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Object
    {
      public :
        void MyFunction( int );
      public-ReadOnly : // <<<<<<<<<<<<<<<<<<<<<<<< j'invente a peine :p
        int MyVariable;
    };
    void Object::MyFunction( int val )
    {
      this->MyVariable= val;
      // code ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(int argc, char ** argv)
    {
      Object MyObject;
      MyObject.MyFunction(512);
      std::cout<< "MyVariable = " << MyObject.MyVariable<< endl;// ok
      //MyObject.MyVariable= 1024;// ERROR !! Ecriture impossible
     
      return 0;
    }
    C'est donc ce public-ReadOnly qui me fait default...

    Vous me direz, FACILE, utilise les accesseurs/mutateurs (setter/getter).
    Oui! Mais c'est que je suis pas un mec facile Si au lieu d'avoir une variable de type int j'ai une structure/class. j'ai pas fini avec mes accesseurs/mutateurs. d'où mon probleme.

    Pouvez vous m'aider, me conseiler, me diriger vers une piste ?

    J'apprend le C++ depuis peu, mais j'ai des bases solides en C et en PHP(POO).



    Merci pour l'interet que vous venez de me porter

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Salut, j'ai un truc à proposer, mais j'ai comme l'impression que c'est pas exactement ce que tu cherches...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <typename T>
    class Object
    {
      public :
        Object( T obj) { m_object = obj; }
        const T & getObject() const { return m_object;}
     
        // Les autres méthodes ont accès à la variable en lecture / écriture
        void Myfunction();
     
      private :
        T m_object;
    };

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Quel est le problème avec ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyClass
    {
    public :
     
        const MyType& GetMyVar() const {return myVar;}
     
    private :
     
        MyType myVar;
    };

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Je pense que ce qu'il voulait dire, c'est qu'avec ton exemple tu vas avoir accès la variable de type MonType... Mais si MonType est une classe, alors il ne pourra pas avoir accès facilement aux variables interne à la classe MonType...

    En fait, j'ai l'impression que notre ami n'aime pas trop l'encapsulation ! Il voudrait mettre des setter/getter pour toutes les données membres de la classe MonType, et ce n'est pas une bonne idée -> couplage fort.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je pense que ce qu'il voulait dire, c'est qu'avec ton exemple tu vas avoir accès la variable de type MonType... Mais si MonType est une classe, alors il ne pourra pas avoir accès facilement aux variables interne à la classe MonType...
    Pourquoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyClass c;
    int x = c.GetMyVar().GetX();

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oui bien sur, évidemment!

    Mais lui n'avait sans doute pas vu ça comme ça !
    il voyait peut etre plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int getVariableA( return myVar.getA() );
    std::string getVariableB(return myVar.getB() );
    double getVariableC( return myVar.getC() );
    Bref, Un accès direct !

    Enfin, je suis pas dans sa tête, je peux me tromper...

  7. #7
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Par défaut
    Merci pour toute vos réponses
    (éxcusez mon temps de réponse)

    Citation Envoyé par poukill
    Salut, j'ai un truc à proposer, mais j'ai comme l'impression que c'est pas exactement ce que tu cherches...
    C'est vrai, mais ca m'a donné une idée...

    Citation Envoyé par Laurent Gomila
    Quel est le problème avec ça ? GetMyVar()
    Il n'y a pas de probleme, juste un inconveniant (peut etre existanciel ... )
    Ce qui me "gene" c'est l'utilisation d'un accesseurs(Getter) alors que je n'execute aucun code ... ( mais ton intervention m'a donné une idée... )

    Citation Envoyé par poukill
    Je pense que ce qu'il voulait dire ...
    ... c'est que de la meme façon qu'on utilise public, proteced, private pour declarrer la visibilité/porté des Membres d'une class j'aurrai également aimé pouvoir déclarer l'acces(Lecture/écriture) a ces Membres (const existe ). Pour des raisons de sécurité de robustesses ...

    Ainsi dans mon imagination, je pensais qu'il y avait quelques chose de similaire en C++.
    A titre indicatife (J'ai pas la prétention de vouloir faire une RFC) :
    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
    // Ici les membre on une porté/visibilité publique
        public : // On a acces aux membre en lecture et écriture
        public-ReadOnly :  // On a acces aux membre en lecture
        public-WriteOnly : // On a acces aux membre en écriture
    
    // Ici les membre on une porté/visibilité hérité
        protected : // On a acces aux membre en lecture et écriture
        protected-ReadOnly : // On a acces aux membre en lecture
        protected-WriteOnly : // On a acces aux membre en écriture
    
    // Ici les membre on une porté/visibilité privé
        private : // On a acces aux membre en lecture et écriture
        private-ReadOnly : // On a acces aux membre en lecture
            cela équivaux a const
        private-WriteOnly : // On a acces aux membre en écriture
            Incohérent ( don't use )
    Ainsi pas d'appel a une fonction pour acceder a une donné. on utilise l'operateur . ou ->
    Les fonctions je les garde pour le concepte : donnée->traitement->resultat


    En fait, j'ai l'impression que notre ami n'aime pas trop l'encapsulation !
    Détrompe toi mon jeune ami
    Les seul encapsulation que je n'aime pas voir son celle de mes despé LôL

    Il voudrait mettre des setter/getter pour toutes les données membres de la classe MonType, et ce n'est pas une bonne idée -> couplage fort.
    Justement, au contraire !!! Je cherche un moyen d'éviter ca ( d'ou ce poste )


    Enfin, je suis pas dans sa tête [...]
    J'ai pourtant fait de mon mieux afin de m'exprimer de façon claire et precisse
    j'ai cette solution ( c'est un mélange de vos sugestions ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Object
    {
        protected :
            MyType VariableProtected;
        public :
            const MyType * VariableReadOnly;
            Object( const MyType ObjType)
            {
                this->VariableProtected = ObjType;
                this->VariableReadOnly = & this->VariableProtected;
            }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(int argc, char ** argv)
    {
      Object * MyObject = new Object( MyType );
      std::cout<< * MyObject->VariableReadOnly << endl;// ok
      MyObject->VariableReadOnly = & MyType ;// ERROR !! Ecriture impossible
     
      delete MyObject;
      return 0;
    }
    Qu'en pensez vous ?


    Merci encore a vous

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il n'y a pas de probleme, juste un inconveniant (peut etre existanciel ... )
    Ce qui me "gene" c'est l'utilisation d'un accesseurs(Getter) alors que je n'execute aucun code ...
    Si ton problème existenciel est d'exécuter un appel de fonction juste pour ça alors rassure-toi, si ton accesseur est inline (ie. dans la définition de la classe) alors le code sera optimisé et aucune fonction ne sera appelée. Cela reviendra à un accès "public-read-only".

    Franchement je pense que tu te prends la tête pour rien.

    Sinon tu peux améliorer ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Object
    {
        protected :
            MyType VariableProtected;
        public :
            const MyType& VariableReadOnly;
            Object( const MyType ObjType) : VariableReadOnly(this->VariableProtected)
            {
                this->VariableProtected = ObjType;
            }
    };

  9. #9
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Par défaut
    Merci beaucoup pour votre aide précieuse Laurent Gomila et poukill

    Franchement je pense que tu te prends la tête ...
    Je ne connais pas une discipline qui en dispence

    ... pour rien.
    mais ça, je ne le savais pas

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

Discussions similaires

  1. variable en lecture seule
    Par airstrike dans le forum C++
    Réponses: 7
    Dernier message: 27/12/2011, 11h08
  2. Réponses: 10
    Dernier message: 20/03/2009, 10h39
  3. variable globale en lecture seule
    Par kromartien dans le forum C
    Réponses: 4
    Dernier message: 22/09/2007, 16h23
  4. Réponses: 5
    Dernier message: 28/10/2003, 15h01
  5. [firebird] Connexion impossible en lecture seule
    Par severine dans le forum Administration
    Réponses: 2
    Dernier message: 01/08/2003, 15h35

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